导航

Xpath语法详解

Posted on 2021-04-12 23:33  水木山川  阅读(683)  评论(0编辑  收藏  举报

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/ ,谢谢合作。