在 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.
在第一个(也是唯一一个)元素的 tail
中 lxml.html.HtmlElement
隐藏了所需的输出...
我一直在尝试使用 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.
在第一个(也是唯一一个)元素的 tail
中 lxml.html.HtmlElement
隐藏了所需的输出...