我创建了一个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元素中提取该比率?
要将文本节点作为节点following-sibling
之后的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()"
应该也可以。
@RomanPerekhrest很长时间后,我在循环中发现您。完美地运作了。一个可选的问题:您知道我如何使用CSS选择器来达到同样的效果。非常感谢。
您可以通过提及
following::*
不起作用的原因来改善答案:*
仅选择元素节点,而不选择文本节点。@MITHU,欢迎光临。关于您的问题:我们无法在CSS中做到这一点,但是在python库中,我们拥有
.next_sibling
inBeautifulsoup
和.tail
inetree
@MathiasMüller,请参阅补充内容,它应该与
"//*[@class='rates']/label/following::text()"
(已测试)感谢您的编辑!您仍然没有添加说明,只是指出了另一种解决方案。给出原因的答案将更具教育意义。