您的位置:首页 > Web前端 > HTML

Html Agility Pack解析html小结

2012-10-22 11:36 429 查看
这两天用到了Html Agility Pack解析html,这东西官方没有文档,不过网上还是有很多资料的,虽然雷同总比没有好.它的网站是 http://htmlagilitypack.codeplex.com
下载下来是一个dll文件直接在工程里引用就可以了.

第一步,加载HTML文件

加载主是HtmlDocument类的load方法完成,里面提供了多种加载方式,看方法的参数类型就一目了然了,主要分两类从Stream和物理路径path加载

public void Load(Stream stream);

public void Load(TextReader reader);

public void Load(Stream stream, bool detectEncodingFromByteOrderMarks);

public void Load(Stream stream, Encoding encoding); //指定了编码格式

public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks);

public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize);

public void Load(string path);

public void Load(string path, bool detectEncodingFromByteOrderMarks);

public void Load(string path, Encoding encoding);

public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks);

public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize);

public void LoadHtml(string html);//直接从html字符串加载,这个用的比较多的

//从字符串加载
HtmlDocument doc = new HtmlDocument();
string html = "<div id="wapper"><h1>Hello World!</h1><p>article content</p></div>";
doc.LoadHtml(html);


第二步,解析html

首先需要了解几个相关的类和方法

HtmlNode 表示一个节点

HtmlNodeCollection 表示一个节点集合

DocumentNode 文档根节点,本身也是一个HtmlNode

HtmlAttribute 表示节点属性

string htmlstr="<div id=\"wapper\"><><p id=\"pid\">article content...</p><p>article content...article content...</p></div>"
HtmlDocument parser = new HtmlDocument();
parser.LoadHtml(htmlstr);
//使用xpath表达式查找所有P标签
HtmlNodeCollection nodes = parser.DocumentNode.SelectNodes("//p");

foreach (HtmlNode tmpNode in nodes)
{
if (tmpNode.Attributes["pid= null)
{

//取节点属性ID的值
string pid = tmpNode.Attributes["pid"].value;
string text = tmpNode.InnerText;

//创建一个新节点
HtmlNode newNode = HtmlNode.CreateNode("<font size=" + size + ">" + text + "</font>");
//替换子节点
tmpNode.ParentNode.ReplaceChild(newNode, tmpNode);
}
else
{
HtmlNode rvNode = tmpNode.ParentNode.RemoveChild(tmpNode, true);  //删除标签,但保留标签内文本
}
}


这里要注意的是在获取属性值时,如果某一个属性名称不存在的话,Attributes["attriname"]返回的是null值

HtmlNode类的属性

Attributes             获取节点的属性集合

ChildNodes           获取子节点集合(包括文本节点)

Closed             该节点是否已关闭(</xxx>)

ClosingAttributes         在关闭标签的属性集合

FirstChild            获取第一个子节点

HasAttributes           判断该节点是否含有属性

HasChildNodes         判断该节点是否含有子节点

HasClosingAttributes       判断该节点的关闭标签是否含有属性(</xxx class="xxx">)

Id                获取该节点的Id属性

InnerHtml            获取该节点的Html代码

InnerText             获取该节点的内容,与InnerHtml不同的地方在于它会过滤掉Html代码,而InnerHtml是连Html代码一起输出

LastChild             获取最后一个子节点

Line               获取该节点的开始标签或开始代码位于整个HTML源代码的第几行(行号)

LinePosition           获取该节点位于第几列

Name              Html元素名

NextSibling           获取下一个兄弟节点

NodeType             获取该节点的节点类型

OriginalName          获取原始的未经更改的元素名

OuterHtml            整个节点的代码

OwnerDocument         节点所在的HtmlDocument文档

ParentNode           获取该节点的父节点

PreviousSibling         获取前一个兄弟节点

StreamPosition         该节点位于整个Html文档的字符位置

XPath              根据节点返回该节点的XPath

HtmlNode类的重要方法

GetElementbyId(string id) 使用元素ID取得该元素

获取父节点的系列方法:

1)public IEnumerable<HtmlNode> Ancestors()

获取当前节点的父节点列表(不包含自身)。

2)public IEnumerable<HtmlNode> Ancestors(string name)

以指定一个名称来获取父节点的列表(不包含自身)。

3)public IEnumerable<HtmlNode> AncestorsAndSelf()

获取当前节点的父节点列表(包含自身)。

4)public IEnumerable<HtmlNode> AncestorsAndSelf(string name)

以指定一个名称来获取父节点的列表(包含自身)。

获取子节点的系列方法:

1)public IEnumerable<HtmlNode> DescendantNodes()

获取当前节点下的所有子节点的列表,包括子节点的子节点(不包含自身)。

2)public IEnumerable<HtmlNode> DescendantNodesAndSelf()

获取当前节点下的所有子节点的列表,包括子节点的子节点(包含自身)。

3)public IEnumerable<HtmlNode> Descendants()

获取当前节点下的直接子节点的列表(不包含自身)。

4)public IEnumerable<HtmlNode> DescendantsAndSelf()

获取当前节点下的直接子节点的列表(包含自身)。

5)public IEnumerable<HtmlNode> Descendants(string name)

获取当前节点下的以指定名称的子节点列表。

6)public IEnumerable<HtmlNode> DescendantsAndSelf(string name)

获取当前节点下的以指定名称的子节点的列表(包含自身)。

7)public HtmlNode Element(string name)

获取第一个符合指定名称的直接子节点的节点元素。

8)public IEnumerable<HtmlNode> Elements(string name)

获取符合指定名称的所有直接子节点的节点列表。

9)public HtmlNodeCollection SelectNodes(string xpath)

获取符合指定的xpath的子节点列表。

10)public HtmlNode SelectSingleNode(string xpath)

获取符合指定的xpath的单个字节点元素。

操作系列方法

public void Remove();

public void RemoveAll();

public void RemoveAllChildren();

public HtmlNode RemoveChild(HtmlNode oldChild);

public HtmlNode RemoveChild(HtmlNode oldChild, bool keepGrandChildren);//移除调用节点调用名字的子节点,第二个参数确定是否保留子孙节点

public HtmlNode ReplaceChild(HtmlNode newChild, HtmlNode oldChild);
//将调用节点原有的一个子节点替换为一个新的节点

public HtmlNode InsertAfter(HtmlNode newChild, HtmlNode refChild);

public HtmlNode InsertBefore(HtmlNode newChild, HtmlNode refChild);

HtmlDocument类的重要方法

public HtmlAttribute CreateAttribute(string name);

public HtmlAttribute CreateAttribute(string name, string value);

public HtmlNode CreateElement(string name);

public XPathNavigator CreateNavigator();

public HtmlTextNode CreateTextNode();

public HtmlTextNode CreateTextNode(string text);

public HtmlNode GetElementbyId(string id);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: