在 xpath 中跟随兄弟未按预期工作

Following sibling within an xpath is not working as intended

我一直在尝试使用 xapth 从一些 html 元素中挖出一部分文本,但似乎我走错了地方,这就是我无法做到的原因。

Html 个元素:

htmlelem = """
<div class="content">
    <p>Type of cuisine: </p>International
</div>
"""

我想使用 xpath 挖掘 International。我知道我可以使用 .next_sibling 获得成功,如果我想使用 css selector 提取相同的内容,但我对走那条路不感兴趣。

也就是说,如果我这样尝试,我可以使用 xpath:

得到相同的结果
tree.xpath("//*[@class='content']/p/following::text()")[0]

但是上面的表达式不是我想要的,因为我不能在 selenium webdriver 中使用相同的表达式如果我坚持 driver.find_element_by_xpath()

我感兴趣的唯一方法如下,但它不起作用:

"//*[@class='content']/p/following::*"

现实生活中的例子:

from lxml.html import fromstring

htmlelem = """
<div class="content">
    <p>Type of cuisine: </p>International
</div>
"""
tree = fromstring(htmlelem)
item = tree.xpath("//*[@class='content']/p/following::text()")[0].strip()
elem = tree.xpath("//*[@class='content']/p/following::*")[0].text
print(elem)

在上面的例子中,我可以成功打印item但无法打印elem。但是,我想修改 elem.

中使用的表达式

我怎样才能让它工作,以便我可以在 lxml 库或 selenium 中使用相同的 xpath

由于 OP 正在寻找一种从 xpath 外部提取文本的解决方案,因此以下内容应该可以做到这一点,尽管方式有些笨拙:

tree.xpath("//*[@class='content']")[0][0].tail

输出:

International

需要这种方法是 lxml 解析 html 代码的方式的结果: tree.xpath("//*[@class='content']") 导致长度为 1 的 list。 列表中的第一个(也是唯一的)元素 - tree.xpath("//*[@class='content']")[0] 是一个 lxml.html.HtmlElement ,它本身可以被视为一个列表并且也有 length=1.

在第一个(也是唯一一个)元素的 taillxml.html.HtmlElement 隐藏了所需的输出...