• Xpath语法详解


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

  • 相关阅读:
    P2801 教主的魔法 (分块)
    BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)
    BZOJ_1601_[Usaco2008_Oct]_灌水_(最小生成树_Kruskal)
    BZOJ_1612_[Usaco2008_Jan]_Cow_Contest_奶牛的比赛_(dfs)
    BZOJ_1833_[ZJOI2010]_数字计数_(数位dp)
    BZOJ_1026_[SCOI2009]_windy数_(数位dp)
    BZOJ_4326_[NOIP2015]_运输计划_(二分+LCA_树链剖分/Tarjan+差分)
    BZOJ_2194_快速傅立叶之二_(FFT+卷积)
    BZOJ_1615_[Usaco2008_Mar]_The Loathesome_Hay Baler_麻烦的干草打包机_(模拟+宽搜/深搜)
    BZOJ_1626_[Usaco2007_Dec]_Building_Roads_修建道路_(Kruskal)
  • 原文地址:https://www.cnblogs.com/zengming/p/14650951.html
Copyright © 2020-2023  润新知