xpath选择器


XPath 的全称是 XML Path Language,即 XML 路径语言,它是一种在结构化文档(比如 XML 和 HTML 文档)中定位信息的语言,XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。


1. 语法

1.1 HTML 实例文档

后面我们将以下面的 HTML 文档介绍 XPath 的使用 http://doc.scrapy.org/en/latest/_static/selectors-sample1.html

<html>
    <head>
        <base href='http://example.com/' />
        <title>Example website</title>
    </head>
    <body>
        <div id='images'>
            <a href='image1.html'>Name: My image 1 <br/><img src='image1_thumb.jpg'/></a>
            <a href='image2.html'>Name: My image 2 <br/><img src='image2_thumb.jpg'/></a>
            <a href='image3.html'>Name: My image 3 <br/><img src='image3_thumb.jpg'/></a>
            <a href='image4.html'>Name: My image 4 <br/><img src='image4_thumb.jpg'/></a>
            <a>Name: My image 5 <br/><img src='image5_thumb.jpg'/></a>
        </div>
    </body></html>

1.2 选取节点

下表是 XPath 常用的语法,实例对应的是上面的 HTML 文档。

表达式描述实例结果
nodename选取此节点的所有子节点body选取 body 元素的所有子节点
/从根节点选取/html选取根元素 html
//匹配选择的当前节点,不考虑位置//img选取所有 img 元素,而不管它们在文档的位置
.选取当前节点./img选取当前节点下的 img 节点
..选取当前节点的父节点../img选取当前节点的父节点下的 title
@选取属性//a[@href=”image1.html”]选取所有 href 属性为 “image1.html” 的 a 节点


//a/@href获取所有 a 节点的 href 属性的值

1.3 谓语

谓语用来查找某个特定的节点或者包含某个指定的值的节点,谓语嵌在方括号中。

路径表达式结果
//body//a[1]选取属于 body 子元素的第一个 a 元素
//body//a[last()]选取属于 body 子元素的最好一个 a 元素
//a[@href]选取所有拥有名为 href 的属性的 a 元素
//a[@href=’image2.html’]选取所有 href 属性等于 “image2.html” 的 a 元素


2. 在 Python 中使用

在 python 中使用 XPath 需要安装相应的库,这里推荐使用 lxml 库。

代码示例:

# -*- coding: utf-8 -*-

from lxml import etree

html = """<html>
    <head>
        <base href='http://example.com/' />
        <title>Example website</title>
    </head>
    <body>
        <div id='images'>
            <a href='image1.html'>Name: My image 1 <br/><img src='image1_thumb.jpg'/></a>
            <a href='image2.html'>Name: My image 2 <br/><img src='image2_thumb.jpg'/></a>
            <a href='image3.html'>Name: My image 3 <br/><img src='image3_thumb.jpg'/></a>
            <a href='image4.html'>Name: My image 4 <br/><img src='image4_thumb.jpg'/></a>
            <a>Name: My image 5 <br/><img src='image5_thumb.jpg'/></a>
        </div>
    </body>
</html>"""

from lxml import etree
soup = etree.HTML(html)
page=soup.xpath('/html/head/base/@href') #从根节点开始选取
page=soup.xpath('/html/head//@href') #也可以这样选择结果是相同的
#//表示从当前节点开始选择,不必考虑位置。
#选取title下所有文本
page=soup.xpath("//title/text()")
#选取HTML下所有a节点
page=soup.xpath('//a')
#选取标签下属性为image.html的scr属性
page=soup.xpath("//a[@href='image1.html']/img/@src")
#选取a标签下第三个href属性
page=soup.xpath("//a[contains(@href, '3')]/@href")
#body最后一个a标签href属性
page=soup.xpath("//body//a[last()]/img/@src")
page=soup.xpath('//a[@class="active"][@id="value"]/img/@src') #多个属性定位


3.常用函数

除了索引、属性外,Xpath还可以使用便捷的函数来增强定位的准确性。下面试常用的几个函数:


 

<a class="menu_hot" href="/ads/auth/promote.html">应用推广</a>

#定位href属性中包含“promote.html”的所有a节点
//a[contains(@href,'promote.html')]

#元素内的文本为“应用推广”的所有a节点
//a[text()='应用推广']

#href属性值是以“/ads”开头的所有a节点
//a[starts-with(@href,'/ads')]

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值