【问题标题】:Can't parse a certain information from some html elements using xpath无法使用 xpath 解析来自某些 html 元素的某些信息
【发布时间】: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 元素中提取该比率?

【问题讨论】:

    标签: python python-3.x xpath scrapy css-selectors


    【解决方案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:: 轴都可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 2018-12-03
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多