Xpath 的应用

1 篇文章 0 订阅
1 篇文章 0 订阅

作为爬虫的小白,在使用了几天的BeautifulSoup之后,对其中的find标签有了一个初步的认识。但是觉得就是每次寻找准确标签的时候,总是有些麻烦,心中无法第一次确保找到想要的结果。之前在网上看到可以使用Xpath是一种特别高效的方法,但是在阅读的时候,总是觉得入门的感觉不好,就始终没有实际使用。今天无意中发现一个网友在讲爬虫中带了一部分Xpath的内容,对于入门是个非常号的方法。这里摘转过来。感谢Jack-Cui。他的博客中对于机器学习和爬虫的内容还是不错的,对于入门是非常适用。

废话少说,还是聚焦到Xpath上去。

Xpath

    这个方法是非常强大的元素查找方式,使用这种方法几乎可以定位到页面上的任意元素。在正式开始使用XPath进行定位前,我们先了解下什么是XPath。XPath是XML Path的简称,由于HTML文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位页面元素。

    假设我们现在以图所示HTML代码为例,要引用对应的对象,XPath语法如下:

   

 绝对路径写法(只有一种),写法如下:

 引用页面上的form元素(即源码中的第3行):

/html/body/form[1]
  • 1

    注意:

  • 元素的xpath绝对路径可通过firebug直接查询。

  • 一般不推荐使用绝对路径的写法,因为一旦页面结构发生变化,该路径也随之失效,必须重新写。

  • 绝对路径以单/号表示,而下面要讲的相对路径则以//表示,这个区别非常重要。另外需要多说一句的是,当xpath的路径以/开头时,表示让Xpath解析引擎从文档的根节点开始解析。当xpath路径以//开头时,则表示让xpath引擎从文档的任意符合的元素节点开始进行解析。而当/出现在xpath路径中时,则表示寻找父节点的直接子节点,当//出现在xpath路径中时,表示寻找父节点下任意符合条件的子节点,不管嵌套了多少层级(这些下面都有例子,大家可以参照来试验)。弄清这个原则,就可以理解其实xpath的路径可以绝对路径和相对路径混合在一起来进行表示,想怎么玩就怎么玩。其实感觉上Xpath更多的使用相对路径和绝对路径来定位,并且优先推荐使用相对路径。这个是Xpath的核心所在

    下面是相对路径的引用写法:

  • 查找页面根元素://

  • 查找页面上所有的input元素://input

  • 查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号)://form[1]/input

  • 查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号)://form[1]//input

  • 查找页面上第一个form元素://form[1]

  • 查找页面上id为loginForm的form元素://form[@id='loginForm']   这个是重点,对于属性而言,标准格式为[@attr=' '],理解了这一点对于使用Xpath就会非常容易了。

  • 查找页面上具有name属性为username的input元素://input[@name='username']

  • 查找页面上id为loginForm的form元素下的第一个input元素://form[@id='loginForm']/input[1]

  • 查找页面具有name属性为contiune并且type属性为button的input元素://input[@name='continue'][@type='button']

  • 查找页面上id为loginForm的form元素下第4个input元素://form[@id='loginForm']/input[4]

    Xpath功能很强大,所以也可以写得更加复杂一些,如下面图所示的HTML源码。


    如果我们现在要引用id为“J_password”的input元素,该怎么写呢?我们可以像下面这样写:
//*[@id='J_login_form']/dl/dt/input[@id='J_password']
  • 1

    也可以写成:

//*[@id='J_login_form']/*/*/input[@id='J_password']
  • 1

    这里解释一下,其中//*[@id=’ J_login_form’]这一段是指在根元素下查找任意id为J_login_form的元素,此时相当于引用到了form元素。后面的路径必须按照源码的层级依次往下写。按照图(3)所示代码中,我们要找的input元素包含在一个dt标签内,而dt又包含在dl标签内,所以中间必须写上dl和dt两层,才到input这层。当然我们也可以用*号省略具体的标签名称,但元素的层级关系必须体现出来,比如我们不能写成//*[@id='J_login_form']/input[@id='J_password'],这样肯定会报错的。

    前面讲的都是xpath中基于准确元素属性的定位,其实xpath作为定位神器也可以用于模糊匹配。本次实战,可以进行准确元素定位,因此就不讲模糊匹配了。如果有兴趣,可以自行了解。

最后还是感谢Jack-Cui。这是这篇文章的源地址:https://blog.csdn.net/c406495762/article/details/72331737#32-xpath
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值