关于xpath选择器tips

from scrapy.selector import Selector

text = '''
<html><body>
<div>
    <ul>
        <li class="item-0"><a href="link1.html">first</a></li>
        <li class="item-1"><a href="link2.html">second</a></li>
        <li class="item-2"><a href="link3.html">third</a></li>
        <li class="item-3"><a href="link4.html">fourth</a></li>
    </ul>
</div>
</body></html>
'''

res = Selector(text=text)

父节点 …


# 获取href属性为link2.html的a标签的父节点的class名
result = res.xpath('//a[@href="link2.html"]/../@class')

print(result)
# ['item-1']

获取属性值

# 获取所有li的子节点a的属性href
result = html.xpath('//li/a/@href')

print(result)
# ['link1.html', 'link2.html', 'link3.html', 'link4.html']

属性多值匹配

使用contains函数匹配
text = '''
<li class="li li-first"><a href="link.html">first item</a></li>
'''
html = Selector(text=text)
# get()方法才有关键词default getall()没有
result = html.xpath('//li[@class="li"]/a/text()').get('no content')
# 'no content'

result = html.xpath('//li[contains(@class, "li")]/a/text()').get()
# 'first item'

多属性匹配

需要匹配满足多个属性的节点,使用 and 运算符
text = '''
<li class="li li-first" name="item"><a href="link.html">first item</a></li>
'''
html = Selector(text=text)
# ['first item']
# 通过class和name两个属性进行匹配
result = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()').get()
# 'first item'

xpath的运算符介绍
xpath operator

按序选择
根据节点所在的顺序进行提取

text = '''
<html><body>
<div>
    <ul>
        <li class="item-0"><a href="link1.html">first</a></li>
        <li class="item-1"><a href="link2.html">second</a></li>
        <li class="item-2"><a href="link3.html">third</a></li>
        <li class="item-3"><a href="link4.html">fourth</a></li>
    </ul>
</div>
</body></html>
'''
html = Selector(text=text)

# 按索引排序 xpath中索引是从 1 开始 另外注意 li[1] 与 (li)[1] 的区别: 
# 后者只选取所有满足条件的li第一个, 前者每找到一个满足条件的节点li,就返回第一个
result = html.xpath('//li[1]/a/text()').get()
# 'first'

# last 最后一个
result = html.xpath('//li[last()]/a/text()').get()
# 'fourth'

# position 位置查找
result = html.xpath('//li[position()<3]/a/text()').getall()
# ['first', 'second']

# - 运算符
result = html.xpath('//li[last()-2]/a/text()').get()
# 'second'

节点轴选择

# 所有祖先节点
result = html.xpath('//li[1]/ancestor::*')
# [<Selector xpath='//li[1]/ancestor::*' data='<html><body>\n<div>\n    <ul>\n        <li '>,
# <Selector xpath='//li[1]/ancestor::*' data='<body>\n<div>\n    <ul>\n        <li class='>,
# <Selector xpath='//li[1]/ancestor::*' data='<div>\n    <ul>\n        <li class="item-0'>,
# <Selector xpath='//li[1]/ancestor::*' data='<ul>\n        <li class="item-0"><a href='>]
## 返回了四个父节点 <html> <body> <div> <ul>

# 祖先节点中的div
result = html.xpath('//li[1]/ancestor::div')
# [<Selector xpath='//li[1]/ancestor::div' data='<div>\n    <ul>\n        <li class="item-0'>]

# 节点的所有属性
result = html.xpath('//li[1]/attribute::*').getall()
# ['item-0']

# 子节点
result = html.xpath('//li[1]/child::a[@href="link1.html"]').get()
# '<a href="link1.html">first</a>'

# 后代节点中的a
result = html.xpath('//li[1]/descendant::a').getall()
# ['<a href="link1.html">first</a>']

# 该节点后面所有节点中的第2个 从1开始计数
result = html.xpath('//li[1]/following::*[2]').getall()
# ['<a href="link2.html">second</a>']

# 该节点后面的所有兄弟节点
result = resp.xpath('//ul/li[contains(@class,"0")]/following-sibling::li/a/text()').getall()
# ['second', 'third', 'fourth']

附一些相关学习链接:

选择器小结:正则表达式、XPath选择器、CSS选择器小结和使用场景
python爬虫:scrapy框架xpath和css选择器语法

<think>嗯,用户想了解如何使用XPath选择器,包括语法和示例。首先,我需要回顾一下XPath的基本概念。根据引用内容,XPath是W3C指定的用于选择XML和HTML节点的语言,Scrapy等工具用它来解析网页。用户可能在使用爬虫或者处理XML/HTML文档时需要用到XPath。 首先,我应该解释XPath的基本结构,比如路径表达式和节点选择。然后,需要覆盖不同的语法,比如节点选择、属性选择、谓语的使用,还有通配符和运算符。用户可能对如何定位特定元素或属性感兴趣,所以示例很重要。 要注意引用中的对比,比如CSS选择器可能不如XPath强大,特别是在获取属性值时。因此,可能需要强调XPath在这方面的优势,比如使用@属性来选择属性值。 另外,用户可能需要知道如何在不同的上下文中使用XPath,比如在Scrapy或者手机自动化中,但问题主要聚焦在语法和示例上,所以应该保持通用。 需要确保所有例子都正确使用$$...$$格式,比如路径表达式,但根据用户指令,行内数学表达式应该用$...$,可能这里需要区分。不过例子中的XPath表达式不是数学公式,所以可能不需要用LaTeX格式,但用户提到所有行内数学表达式必须用$...$,所以可能需要检查是否有需要的地方。例如,在路径表达式中,像/bookstore/book这样的可能不需要,但如果有变量的话可能需要处理。 然后生成相关问题,需要覆盖XPath的优势、常见函数、与CSS的对比,以及调试工具。确保问题基于引用内容,比如引用2提到解析速度,引用3提到属性获取困难,所以相关问题可以涉及这些点。 最后,检查是否符合所有系统级指令,如中文回答、正确引用标识、结构清晰等。确保没有使用markdown,用自然的中文段落,分步骤解释,示例代码用正确的格式。</think>### XPath选择器的使用方法及语法解析 #### 一、XPath选择器基础 XPath(XML Path Language)是一种用于在XML和HTML文档中定位节点的语言,通过路径表达式选择节点或节点集合[^1][^4]。其核心语法包含以下部分: 1. **节点选择** - `/`:从根节点开始选择(绝对路径),例如:`/html/body/div` - `//`:选择文档中所有符合条件的节点(相对路径),例如:`//div/p` 选择所有`<div>`下的`<p>`标签 - `.`:当前节点 - `..`:父节点 2. **属性选择** 使用`@`符号选择属性,例如: - `//a/@href`:获取所有`<a>`标签的`href`属性值[^3] - `//input[@type="text"]`:选择`type`属性为`text`的`<input>`标签 3. **谓语(Predicates)** 用于过滤节点,写在方括号`[]`内: - `//div[1]`:选择第一个`<div>` - `//li[last()]`:选择最后一个`<li>` - `//span[@class="active"]`:选择`class`为`active`的`<span>` #### 二、常用语法示例 1. **选择特定文本内容** ```xpath //h1/text() # 获取所有<h1>标签的文本内容 ``` 2. **组合条件筛选** ```xpath //div[@id="header" and contains(@class, "main")] # 选择id为header且class包含main的<div> ``` 3. **通配符使用** - `*`:匹配任意节点,例如:`//div/*` 选择`<div>`的所有子节点 - `@*`:匹配任意属性,例如:`//a[@*]` 选择所有带有属性的`<a>`标签 4. **轴(Axis)操作** 定义节点与其他节点的关系: - `//div/following-sibling::p`:选择`<div>`之后的所有同级`<p>`标签 - `//span/parent::div`:选择`<span>`的父级`<div>`标签 #### 三、实战应用场景 1. **在Scrapy中提取数据** ```python response.xpath('//a/@href').getall() # 获取页面上所有链接 response.xpath('//div[@class="title"]/text()').get() # 提取标题文本 ``` 2. **XML文档处理** ```xpath /bookstore/book[price>35]/title # 选择价格大于35的书籍标题 ``` #### 四、XPath与CSS选择器对比 1. **功能差异** - XPath支持父节点回溯(如`..`)和复杂路径,CSS选择器仅支持向下遍历[^3] - XPath可直接通过`@`提取属性,CSS需借助`::attr()`语法[^2] 2. **性能差异** XPath解析速度通常与CSS选择器相近,但在复杂文档中可能略慢[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值