嘘~ 正在从服务器偷取页面 . . .

Xpath表达式


Xpath 使用笔记


  • 别在想这个和正则学哪个了,这个不学,爬虫白学

初级


  • 所有的div标签

    • xptah = '//div'
  • 所有的有id属性的div

    • xptah = '//div[@id]'
  • 所有的没有id属性的div

    • xptah = '//div[not(@id)]'
  • 所有的没有属性的div

    • xptah = '//div[not(@*)]'
  • 所有的div,选择其中的第四个

    • xptah = '//div[4]'
  • 所有的iddatadiv

    • xptah = '//div[@id=‘data’]'
    • ==因为 id 是唯一所以只能匹配到一个==
  • 所有的iddataclasspagediv

    • xptah = '//div[@id=‘data’ and @class='page']'
  • 所有iddata 且 标签内文本为测试div

    • xptah = '//div[@id='data' and text()='测试']'
  • 所有iddata 或者 idpagediv

    • xptah = '//div[@id='data' or @id='page']'
  • 所有的div标签 和 p标签

    • xptah = '//div | //p'
  • 所有的div标签 和 p标签且dividdata ,p标签内文本为测试

    • xptah = '//div[@id='data'] | //p[text()='测试']'
  • 定位标签名为 a 或者 标签名为 span 的所有标签

    • xptah = '//*[name()='a' or name()='span']'

中级


  • 所有的div下的span子标签 ==child==
    • xptah = '//div/child::span'
    • 等价于:xptah = '//div/span'
  • 定位所有divclass属性值 ==attribute==
    • xptah = '//div/attribute::class'
    • 等价于:xptah = '//div/@class'
  • 定位ul的父节点 ==parent==
    • xptah = '//ul/parent:: *'
    • 等价于:xptah = '//ul/..'
    • ~~tips: /. 代表自己 /self
    • ~~tips: /.. 代表父类 /parent:: *
  • 定位ul的所有父节点div ==父类的父类== ==ancestor-or-self==
    • xptah = '//ul/ancestor-or-self::div'
    • -or-self:表示包含自身,但上述标签是ul,所以不会被div定位到
  • 定位ul的所有后代div ==后代的后代== ==descendant-or-self==
    • xptah = '//ul/descendant-or-self::div'
    • 等价于://ul//div
    • -or-self:表示包含自身,但上述标签是ul,所以不会被div定位到

  • 定位ul结束标签之后的所有div ==不包含 ul 本身== ==following==

    • xptah = '//ul/following::div'
  • 定位ul开始标签之前所有节点div ==不包含 ul 本身== ==preceding==

    • xptah = '//ul/preceding::div'
      tips:这两个定位都是优先获取接近开始和结束的标签

  • 定位ul开始标签之前所有的同级节点div ==不包含 ul 本身== ==preceding-sibling==

    • xptah = '//ul/preceding-sibling::div'
  • 位置定位 ul下所有的li标签,且li标签的位置大于3小于6 ==position==

    • xptah = '//ul/li[position()>3 and position() <6]'
    • ==只定位到第 4 个和第 5 个==
  • 位置定位 ul下最后一个li标签 ==last()==

    • xptah = '//ul/li[last()]'
---

高级


  • 定位所有id属性名去除前后空格后为datadiv ==normalize-space==
    • xptah = '//div[normalize-space(@id)='data']'
  • 定位子标签下li大于两个的ul ==count==
    • xptah = '//ul[count(li)>2]'
    • tips:这里可以使用大于,小于,等于,大于小于等多种
  • 定位子标签下li大于两个且小于 15 个的ul ==count==
    • xptah = '//ul[count(li)!=2 and count(li) <15]'
    • tips:举一反三,还有很多种写法
  • 定位所有标签名字以s开头的标签 ==starts-with==
    • xptah = '//*[starts-with(name(),'s')]'
    • tips:注意是标签名字,比如 span 标签,而不是里面的属性
  • 定位所有名字中包含 s 的标签 ==contains==
    • xptah = '//*[contains(name(),'s')]'
    • tips:注意是标签名字,比如 span 标签,而不是里面的属性
  • 定位所有属性 class 名中不包含 s 的标签 ==contains==
    • xptah = '//*[not(contains(@class,'s'))]'
    • tips:注意是标签名字,比如 span 标签,而不是里面的属性
    • tips:不要什么属性,就定位到那个属性,然后加上 not()即可
  • 定位所有 class 属性名长度大于 3 的标签 ==string-length==
    • xptah = '//*[string-length(@class) > 3]'
    • tips:这里可以使用大于,小于,等于,大于小于等多种

运算查找


  • mod 配合 position() 使用 ==mod 取余计算== ==position 返回当前标签位置==
  • 拿到所有li位置在偶数位的标签
    • xptah = '//li[position() mod 2 = 0 ]'
  • 拿到所有li位置在奇数位的标签
    • xptah = '//li[position() mod 2 = 1 ]'
  • 拿到所有li位置除以 2 等于 2 的标签
    • xptah = '//li[position() div 2 = 2]'


文章作者: 林木木
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 林木木 !
评论
  目录