xpath用单斜杠解析时搜索不到,求解!

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 pin inner div p两个节点的文本内容。因此,使用双斜杠可以得到正确的结果。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/692921
  • 你也可以参考下这篇文章:爬虫时xpath解析不到网页数据
  • 除此之外, 这篇博客: Xpath教程详解,让你的数据采集效率提高20倍中的 为什么要写XPath这个话题? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 最近发现在用户用八爪鱼采集数据过程中遇到的问题,有80%以上的数据爬取遗漏、不准确的问题,都是因为:

    「XPath地址不准确」导致。

    比如:

    A:“我设计好的规则,怎么采集下来很多空白的数据?”

    B:“我采集下来的数据,怎么有那么多不必要的字段?导致我后续清洗数据的工作量非常大。”

    C:“为何我采集的数据是错的?”

    等等……

    这些问题都源自采集数据过程中,数据**「定位」**不够精准导致。

    而XPath的最大作用就在于**「精准定位」**目标数据。

  • 您还可以看一下 CSDN就业班老师的第一章:数据提取与清洗策略课程中的 百度针对xpath爬虫的反爬策略与解决方式小节, 巩固相关知识点