xpath用单斜杠解析时搜索不到,但双斜杠是可以的,为什么呢?求指导,代码如下。
from scrapy import Selector
content = '''
<html>
<div>
<p>out inner div p</p>
<div id="inner"><p>in inner div p</p></div>
</div>
<p>out div p</p>
</html>
'''
selector = Selector(text=content)
# 在整个文档中选取id为inner的div节点
inner_div_sel = selector.xpath('/html/div/p/text()').getall()
print(inner_div_sel)
#输出结果:[]
inner_div_sel = selector.xpath('//div/p/text()').getall()
print(inner_div_sel)
#输出结果:['out inner div p', 'in inner div p']
第16行改成就能找到了:
inner_div_sel = selector.xpath('/html/body/div/p/text()').getall()
原因应该是Selector实例化的过程中,会将文本内容转化为标准的html格式,也就是会加上body这一层,所以,使用绝对路径的方式定位时不写这一级肯定是定位不到的。证据如下:
>>> selector = Selector(text=content)
>>> selector.getall()
['<html>\n <body><div>\n <p>out inner div p</p>\n <div id="inner"><p>in inner div p</p></div>\n </di
v>\n <p>out div p</p>\n</body></html>']
有帮助的话,请点采纳该答案~
以下回答结合了chat gpt的内容
在XPath中,单斜杠(/)表示从根节点开始的绝对路径。所以/html/div/p/text()
的意思是从根节点开始,选择所有<html>
下的<div>
下的<p>
节点的文本内容。但是在提供的HTML文档中,<p>out inner div p</p>
并不是直接位于<html>
下的<div>
下的<p>
节点,而是位于<div>
下的另一个<div>
节点的子节点。因此,使用单斜杠无法选择到想要的节点,所以返回一个空列表。
另一方面,双斜杠(//)表示选择文档中符合条件的节点,无论它们在哪个位置。所以//div/p/text()
表示选择文档中所有<div>
下的<p>
节点的文本内容。这样可以正确地选择到out inner div p
和in inner div p
两个节点的文本内容。因此,使用双斜杠可以得到正确的结果。
最近发现在用户用八爪鱼采集数据过程中遇到的问题,有80%以上的数据爬取遗漏、不准确的问题,都是因为:
「XPath地址不准确」导致。
比如:
A:“我设计好的规则,怎么采集下来很多空白的数据?”
B:“我采集下来的数据,怎么有那么多不必要的字段?导致我后续清洗数据的工作量非常大。”
C:“为何我采集的数据是错的?”
等等……
这些问题都源自采集数据过程中,数据**「定位」**不够精准导致。
而XPath的最大作用就在于**「精准定位」**目标数据。