一、什么是XPath
XPath(XML Path Language)是XML路径语言,作用:
通过路径表达式,查询XML/HTML文档中的节点、节点文本、节点属性,同时支持条件过滤。
重点:HtmlAgilityPack可以把HTML文档模拟成XML DOM,因此可以直接使用XPath抓取网页内容。
二、参考示例XML
<?xml version="1.0" encoding="utf-8"?>
<WebInfos>
<WebInfo>
<Name>FoxDevelop</Name>
<Domain>https://foxdevelop.com</Domain>
<IP type="ipv4">127.0.0.1</IP>
<Age>1</Age>
</WebInfo>
<WebInfo>
<Name>google</Name>
<Domain>https://www.google.com</Domain>
<IP type="ipv4">95.0.0.1</IP>
<Age>23</Age>
</WebInfo>
<WebInfo>
<Name>microsoft</Name>
<Domain>https://www.microsoft.com</Domain>
<IP type="ipv4">192.186.0.1</IP>
<Age>13</Age>
</WebInfo>
</WebInfos>Code language: HTML, XML (xml)
三、XPath语法详解
基础符号说明
| 符号 | 含义 |
|---|---|
/ | 从根节点开始查找;层级分隔 |
// | 在全文任意位置查找,不限制层级 |
[] | 筛选条件、下标,下标从1开始(不是0) |
@ | 匹配标签属性 |
案例逐条解析
/WebInfos
从根节点获取顶层节点<WebInfos>/WebInfos/WebInfo[1]
获取第1个<WebInfo>节点 → FoxDevelop信息
⚠️ XPath下标起始为1
/WebInfos/WebInfo[Age>5]
筛选子节点<Age>数值大于5的WebInfo节点
匹配结果:谷歌(23)、微软(13)/WebInfos/WebInfo[Age>5]/Name
在上一条筛选基础上,提取<Name>子节点/WebInfos/WebInfo[last()]last()函数:获取最后一个WebInfo → 微软/WebInfos/WebInfo[last()-1]
获取倒数第二个WebInfo → 谷歌/WebInfos/WebInfo[position()<3]position()获取当前节点序号;匹配序号小于3 → 前2条(FoxDevelop、谷歌)//IP[@type='ipv4']//全局搜索;筛选属性type等于ipv4的<IP>节点//@type
获取文档中所有名为type的属性//WebInfo
全局搜索文档内所有<WebInfo>节点,无论嵌套层级
四、拓展实用写法
//Name/text() # 获取Name标签内部文本
//WebInfo[Name="FoxDevelop"] # 根据文本匹配节点
//IP/@type # 获取IP标签type属性的值Code language: JSON / JSON with Comments (json)
五、在HtmlAgilityPack使用
var doc = new HtmlDocument();
doc.Load("demo.xml");
// 选取所有Age>5的网站名称
var nodes = doc.DocumentNode.SelectNodes(@"/WebInfos/WebInfo[Age>5]/Name");
foreach(var node in nodes)
{
Console.WriteLine(node.InnerText);
}Code language: PHP (php)