无法使用 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)
运行上面的脚本后,我得到了<br class="hidden-md hidden-lg">
,而我希望得到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_sibling
和 etree
中的 .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 -- Xpath Helper插件的安装xpath的基本使用