无法使用 xpath 解析来自某些 html 元素的某些信息

Posted

技术标签:

【中文标题】无法使用 xpath 解析来自某些 html 元素的某些信息【英文标题】:Can't parse a certain information from some html elements using xpath 【发布时间】:2019-11-14 05:40:52 【问题描述】:

我创建了一个 xpath 表达式来定位一个元素,这样我就可以使用 scrapy 中的 xpath 从一些 html 元素中提取某些信息。反正我也达不到。

HTML 元素:

<div class="rates">
                <label>
                  Rates :
                </label>
                  R 3500
                  <br class="hidden-md hidden-lg">
              </div>

我希望从中提取R 3500

我试过了:

from scrapy import Selector

html = """
<div class="rates">
                <label>
                  Rates :
                </label>
                  R 3500
                  <br class="hidden-md hidden-lg">
              </div>
"""
sel = Selector(text=html)
rate = sel.xpath("//*[@class='rates']/label/following::*").get()
print(rate)

运行上面的脚本后,我得到了&lt;br class="hidden-md hidden-lg"&gt;,而我希望得到R 3500

如果选择lxml,我可以使用.tail。然而,当我去scrapy时,我没有发现任何类似的东西。

如何使用 xpath 从 html 元素中提取该比率?

【问题讨论】:

【参考方案1】:

要在label 节点之后将文本 节点作为following-sibling

...
sel = Selector(text=html)
rate = sel.xpath("//*[@class='rates']/label/following-sibling::text()").get().strip()
print(rate)

输出:

R 3500

添加"//*[@class='rates']/label/following::text()" 也应该可以工作。

https://www.w3.org/TR/1999/REC-xpath-19991116#axes

【讨论】:

我在很长一段时间后发现你在循环中@RomanPerekhrest。它完美地工作。一个可选问题:你知道我如何使用 css 选择器实现相同的目标吗?非常感谢。 您可以通过提及following::* 不起作用的原因来改进您的答案:* 只选择 element 节点,而不选择文本节点。 @MITHU,欢迎您。至于你的问题:我们不能在 css 中做到这一点,但在 python 库中,我们有 Beautifulsoup 中的 .next_siblingetree 中的 .tail @MathiasMüller,看看补充,它应该与"//*[@class='rates']/label/following::text()"(已测试)一起使用 感谢编辑!您仍然没有添加解释,只是指出另一种解决方案。给出原因的答案会更有教育意义。【参考方案2】:

为了补充accepted answer,这是完全正确的,这里解释一下原因

//*[@class='rates']/label/following::*

给定文件

<div class="rates">
   <label>
   Rates :
   </label>
   R 3500
   <br class="hidden-md hidden-lg">
</div>

返回文本R 3500* 只选择label 元素之后的元素节点,而不选择文本节点。元素和文本节点是 XPath 文档模型中的不同概念。您可以使用稍微不同的文档来测试此声明:

<div class="rates">
   <label>
   Rates :
   </label>
   <any>R 3500</any>
   <br class="hidden-md hidden-lg">
</div>

这会导致您的代码返回 any 元素。

text()(更具体)和node()(更一般)都选择此文本节点,在这种情况下,following::following-sibling:: 轴都可以工作。

【讨论】:

以上是关于无法使用 xpath 解析来自某些 html 元素的某些信息的主要内容,如果未能解决你的问题,请参考以下文章

python简单使用xpath查找网页元素

13_Python_解析库_Xpath的使用

Python爬虫 解析 xpath -- Xpath Helper插件的安装xpath的基本使用

XPath / Selenium 无法使用包含 / 开头的部分 id 定位元素

Xpath 详解

无法使用xpath follow-sibling获取元素