xpath 语法
response.selector属性返回内容相当于response的body构造了一个Selector对象。
Selector对象可以调用xpath()方法实现信息的解析提取。
在xpath()后使用extract()可以返回所有的元素结果。
若xpath()有问题,那么extract()会返回一个空列表。
在xpath()后使用extract_first()可以返回第一个元素结果。
选择直接子节点
{node}/{node1}: 选择从{node}的直接子节点中选择标签为{node1}节点.
/node[1] 返回的是所有父节点下,第一个出现的节点
选择所有的子节点
//{node}: 选择根节点下所有标签为{node}的子节点.
//{node}//{node1}: 选择根节点下所有标签为{node1}且父节点包含标签{node}的节点
从选择的子节点列表中选择第n个子节点
//{node}[n]: 先把兄弟节点聚合在一个list变成[list_1, list_2, ...], 然后从每个list中选择第n个, 如果list的长度不足n个则跳过.
(//{node})[n]: 把所有选择的节点放在一条list, 然后从这个list中选择第n个
//div[@id='details']/following-sibling::a[1] 获取id为details标签的下一个a标签
//div[@id='details']/following-sibling::*[N] 获取id为details标签后面的第N个标签
//div[@id='details']/preceding-sibling::a[1] 获取id为details标签的上一个a标签
//div[@id='details']/preceding-sibling::*[N] 获取id为details标签前面的第N个标签
//div[@class="details"]/span[last()] 获取span最后一个节点
//div[@class="details"]/span[last()-1] 获取span倒数第二个节点
获取第三个a标签的父标签:"//a[@id=='3']/.."
使用节点属性作为选择条件
{node}[@{attr}='{val}']: 选中节点必须有名字为{attr}的属性, 且这个属性的值等于{val}.
{node}[contains(@{attr}, '{val}']: 选中节点必须有名字为'{attr}'的属性, 且这个属性的值包含{val}.
提取节点属性的值
{node}/@{attr}: 提取选择节的点中属性名为{attr}的值.
提取节点中的文本内容
{node}/text(): 提取当前选择节点的文本内容, 不包括子节点的文本.
{node}//text(): 提取选择节点的文本内容, 包括子节点的文本.
选取若干路径
//title | //price 选取文档中的所有 title 和 price 元素。
过滤特定的标签属性
//div[contains(@class,"details") and not(contains(name(.),"img"))]
//div[contains(@class,"details")][name(.)!='img']
//p[@class="details"]/*[not(name()="img")]
//node[contains(text(),substring] 所有节点名为node,且其文本中包含substring的节点
//div[@id="pagination"]//a[contains(text(),"下一页")] 所有包含“下一页”字符串的超链接节点
//*[count(span)=2] 所有包含两个span孩子节点的节点
//*[count(*)=2] 所有包含两个孩子节点的节点
//*[name()='dd'] 所有名字为dd的节点,等同于//dd
//*[string-length(name())=3] 名字长度为3个字母的节点
/child::dd 等价于/dd
//dd/descendant::* 所有以dd为其祖先的节点
//dd/parent::* dd节点的所有父节点
//dd[position() mod 2 = 0] 偶数位置的dd节点
author[not(last-name = "adv")] 所有不包含元素last-name值为adv的节点
P/text()[2] 当前上下文节点中的P节点的第二个文本节点
ancestor::BOOK[1] 离当前上下文节点最近的book祖先节点
//node[text()="next"] 锚文本内容等于next的node节点
//div[@class="details"]/span[last()] 获取span最后一个节点
//div[@class="details"]/span[last()-1] 获取span倒数第二个节点
starts-with:匹配属性节点对应开始位置的关键字,对应的有ends-with,//*[starts-with(@class,'copyRight')]
contain:匹配属性节点对应包含的关键字,//div[contains(@class,'login')]
and 与的关系,//div[contains(@id,'root') and contains(@id,'admin')]
not 返回所有非属性id=root的div,//div[not (@id='root')]
在xpath表达式中使用变量
在xpath表达式中是${varname}定义变量, 类似于bash
符号 说明
/ 从根节点选取,使用绝对路径,路径必须完全匹配
// 从整个文档中选取,使用相对路径
. 从当前节点开始选取
.. 从当前节点父节点开始选取
@ 选取属性
/* 模糊匹配
XPath轴(XPath Axes)可定义某个相对于当前节点的节点集:
1、child 选取当前节点的所有子元素
2、parent 选取当前节点的父节点
3、descendant 选取当前节点的所有后代元素(子、孙等)
4、ancestor 选取当前节点的所有先辈(父、祖父等)
5、descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身
6、ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
7、preceding-sibling 选取当前节点之前的所有同级节点
8、following-sibling 选取当前节点之后的所有同级节点
9、preceding 选取文档中当前节点的开始标签之前的所有节点
10、following 选取文档中当前节点的结束标签之后的所有节点
11、self 选取当前节点
12、attribute 选取当前节点的所有属性
13、namespace 选取当前节点的所有命名空间节点
备注:
作者:Jason Zeng 于 2021-04-12
博客:http://www.cnblogs.com/zengming/
GItHub:https://github.com/lovelifeming
严正声明:
1.由于本博客部分资源来自互联网,版权均归原作者所有。转载的目的是用于学术交流与讨论学习,将不对任何资源负法律责任。
2.若无意中侵犯到您的版权利益,请来信联系我,我会在收到信息后会尽快给予处理!
3.所有资源内容仅供学习交流之用,请勿用作商业用途,谢谢。
4.如有转发请注明出处,来源于http://www.cnblogs.com/zengming/ ,谢谢合作。