.net HTML解析工具HtmlAgilityPack使用
HtmlAgilityPack 官网:parser | Html Agility Pack (html-agility-pack.net)
XPath路径表达式
用来选取XML文档中的节点或节点集的
nodename 节点名,选取此节点的所有子节点 例: childnode 当前节点中的childnode子节点,不包含孙子及以下的节点
/ 从根节点选取 例:/root/childnode/grandsonnode
// 表示所有后代节点 例://childnode 所有名为childnode的后代节点
. 表示当前节点 例: ./childnode 表示当前节点的childnode节点
.. 表示父节点 例: ../nearnode 表示父亲节点的nearnode子节点
@ 选取属性 /root/childnode/@id 表示childnode的所有含有id属性的节点集
li_node.SelectSingleNode("//img") 代表查询出整个页面所有的img标签,和当前li_node标签无关
li_node.SelectNodes("div//img") 代表查询当前节点li_node下面div中所有的img标签,节点报含
4、谓语(Predicates)
谓语可以对节点集进行一些限制,使选择更精确
/root/book[1] 节点集中的第一个节点
/root/book[last()] 节点集中最后一个节点
/root/book[position() - 1] 节点集中倒数第二个节点集
/root/book[position() < 5] 节点集中前五个节点集
/root/book[@id] 节点集中含有属性id的节点集
/root/book[@id='chinese'] 节点集中id属性值为chinese的节点集
/root/book[price > 35]/title 节点集中book的price元素值大于35的title节点集
5、通配符:XPath路径中同样支持通配符(*,@*,node(), text())
例: /bookstore/*
//title[@*]
6、XPath轴
定义相对于当前节点的节点集
ancestor 所有祖先节点
attribute 所有属性节点
child 所有子元素
descendant 所有后代节点(子,孙。。。)
following 结束标记后的所有节点 preceding 开始标记前的所有节点
following-sibling 结束标记后的所有同胞节点
preceding-sibling 开始标记前的所有同胞节点
namespace 当前命名空间的所有节点
parent 父节点
self 当前节点
用法:轴名称::节点测试[谓语]
例: ancestor::book
child::text()
7、运算符
| 两个节点集的合并 例:/root/book[1] | /root/book[3]
+,-,*,dev,mod
=,!=,<,>,<=,>=
or,and 或和与
我知道如何获取相同CSS类的DIV列表,例如
<div class="class1">1</div>
<div class="class1">2</div>
使用xpath //div[@class='class1']
但是,如果div有多个类,例如
<div class="class1 class2">1</div>
使用
//div[contains(@class, 'class1') and contains(@class, 'class2')]
补充:
多个属性条件查询 //div[@align='center' and @height='24']
不存在class属性 //div[not(@class)]
示例:
html文本:
<li class="tab-trigger active"></li> <!-- 1 -->
<li class="tab-trigger"></li> <!-- 2 -->
<li class="tab-trigger"></li> <!-- 3 -->
<li class="tab-trigger"></li> <!-- 4 -->
<li class="tab-trigger last-col"></li> <!-- 5 -->
node_content.SelectNodes("li[@class=\"tab-trigger\"]")
得到第 2,3,4三个元素
node_content.SelectNodes("li[contains(@class,\"tab-trigger\")]")
得到 1,2,3,4,5五个元素
node_content.SelectNodes("li[contains(@class,\"active\")]")
得到 1 一个元素
node_content.SelectNodes("li[not(contains(@class,\"active\"))]")
得到 2,3,4,5四个元素
node_content.SelectNodes("li[not(contains(@class,\"last-col\"))]")
得到 1,2,3,4四个元素