传统解析html标签的方式是利用HttpWebRequest获取html字符串,然后通过正则表达式进行解析,但是这种方式比较麻烦。有没有更简单的方式呢?有,那就是Html Agility Pack,它可以做到像用XmlDocument类来解析xml一样轻松、方便,并且是开源的
其源代码可以通过github下载,下载地址为:https://github.com/zzzprojects/html-agility-pack
其官网地址为:https://html-agility-pack.net/
其实Html Agility Pack的类不是很多,我们解析Html的时候,用到的也就HtmlDocument和HtmlNode(还有HtmlNodeCollection集合类)这几个类。官网也有相对应的API文档说明,其实真的是简单易懂,传送门:API文档
教程:https://www.cnblogs.com/xuliangxing/p/8004403.html
/*
c# HtmlAgilityPack
--------------------------------
* 关于节点的重要属性:
Attributes 获取节点的属性集合
ChildNodes 获取子节点集合(包括文本节点)
HasAttributes 判断该节点是否含有属性
HasChildNodes 判断该节点是否含有子节点
HasClosingAttributes 判断该节点的关闭标签是否含有属性(</xxx class="xxx">)
Line 获取该节点的开始标签或开始代码位于整个HTML源代码的第几行(行号)
Name Html元素名
Id 获取该节点的Id属性
NextSibling 获取下一个兄弟节点
PreviousSibling 获取前一个兄弟节点
NodeType 获取该节点的节点类型(四个:Text,Element,Document,Comment)
OwnerDocument 节点所在的HtmlDocument文档
ParentNode 获取该节点的父节点
XPath 根据节点返回该节点的XPath
* 关于节点的重要方法:
Elements(string name); 根据参数名获取匹配的元素集合
Element(string name); 根据参数名获取一个元素
DescendantNodes(); 获取所有子代节点,如果有参数,注意元素名要与参数匹配
DescendantNodesAndSelf(); 获取所有的子代节点以及自身,如果有参数,注意元素名要与参数匹配
--------------------------------
Document.GetElementbyId("box").InnerText;
//枚举元素两种写法
string s = "";
HtmlNodeCollection nodes = Document.DocumentNode.SelectNodes("//li");
foreach (HtmlNode li in nodes)
{
s+=li.InnerText+" ";
}
--------------------------------
foreach (HtmlNode li in Document.DocumentNode.Descendants("li"))
{
s+=li.InnerText+" ";
}
--------------------------------
string s = node.Attributes["src"].Value;
string s = node.Attributes["href"].Value;
string s = node.Attributes["title"].Value;
--------------------------------
//获取所有板块的a标签
HtmlAgilityPack.HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//a");
--------------------------------
//获取所有a标签的链接
foreach (HtmlNode a in Document.DocumentNode.Descendants("a"))
{
s+=a.Attributes["href"].Value+" ";
}
或者
foreach (HtmlNode a in Document.DocumentNode.SelectNodes("//a"))
{
s+=a.Attributes["href"].Value+" ";
}
--------------------------------
//获取标题,SelectSingleNode用于获取满足条件的唯一的节点。
Document.DocumentNode.SelectSingleNode("//title").InnerText;
--------------------------------
//获取name为selected的li,也就是相当于getElementsByName():
HtmlNode node = Document.DocumentNode.SelectSingleNode("//li[@name='selected']");
s=node.InnerText;
或者
Document.DocumentNode.SelectSingleNode("//li[@name='selected']").InnerText;
--------------------------------
每一个Htmlnode,你要获取他的数据用这个方法: node.Attributes["src"].Value
--------------------------------
xpath包含7个类型:元素(Element),属性(Attribute),文本(Test),命名空间,处理指令,注释,文档根节点。
下面列出了最有用的路径(也就是遇到的参数叫:XPath)表达式:
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。
* 注意:
“//”:从当前选择的节点开始寻找,对于后面的表达式是在当前节点中的任意位置寻找,只要符合的就加入到选择结果中。
“./”:也是从当前选择的节点开始选择,但是仅仅是寻找当前节点的直系子元素,而对于孙子及以后的节点都不考虑。
--------------------------------
/div/li[1]:选取属于div子元素的第一个li元素。
/div/li[last()]:选取属于div子元素的最后一个li元素。
/div/li[last()-1]:选取属于div子元素的倒数第二个li元素。
/div/li[position()<3]:选取最前面的两个属于 div 元素的子元素的li元素。
//title[@lang]:选取所有拥有名为lang的属性的title元素。
//div[@id='box']:选取所有div元素,且这些元素拥有值为box的id属性。
/div/li[Order>2]:选取div元素的所有li元素,且其中的Order元素的值须大于2。
/div/li[Order<3]/Title:选取div元素中的li元素的所有Title元素,且其中的Order元素的值须小于3。
--------------------------------
*/
https://www.cnblogs.com/dy470208739/p/8491453.html
---------------------
作者:zxy2847225301
来源:CSDN
原文:https://blog.csdn.net/zxy13826134783/article/details/85229796
版权声明:本文为博主原创文章,转载请附上博文链接!