XPath

一、什么是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)
@匹配标签属性
案例逐条解析
  1. /WebInfos
    从根节点获取顶层节点 <WebInfos>
  2. /WebInfos/WebInfo[1]
    获取第1个<WebInfo>节点 → FoxDevelop信息

⚠️ XPath下标起始为1

  1. /WebInfos/WebInfo[Age>5]
    筛选子节点<Age>数值大于5的WebInfo节点
    匹配结果:谷歌(23)、微软(13)
  2. /WebInfos/WebInfo[Age>5]/Name
    在上一条筛选基础上,提取<Name>子节点
  3. /WebInfos/WebInfo[last()]
    last()函数:获取最后一个WebInfo → 微软
  4. /WebInfos/WebInfo[last()-1]
    获取倒数第二个WebInfo → 谷歌
  5. /WebInfos/WebInfo[position()<3]
    position()获取当前节点序号;匹配序号小于3 → 前2条(FoxDevelop、谷歌)
  6. //IP[@type='ipv4']
    //全局搜索;筛选属性type等于ipv4<IP>节点
  7. //@type
    获取文档中所有名为type的属性
  8. //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)

Previous:
Next:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注