我创建了一个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元素中提取该费率?
答案 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()"
也应该起作用。
答案 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::
轴均起作用。>