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

时间:2019-07-03 13:51:31

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

我创建了一个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)

运行上面的脚本后,这就是我得到的<br class="hidden-md hidden-lg">,而我希望得到的是R 3500

如果选择.tail,我本可以使用lxml。但是,当我抓狂时,找不到任何类似的东西。

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

2 个答案:

答案 0 :(得分:3)

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

...
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

答案 1 :(得分:1)

为补充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::轴均起作用。