我一直在尝试使用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]
但是上面的表达式不是我想要的,因为如果我坚持使用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
中使用的表达式。
如何使它起作用,以便可以在xpath
库或lxml
中使用相同的selenium
?
答案 0 :(得分:2)
由于OP一直在寻找一种从xpath外部提取文本的解决方案,因此以下方法应该做到这一点,尽管有些尴尬:
tree.xpath("//*[@class='content']")[0][0].tail
输出:
国际
此方法的需要是lxml解析html代码的方式的结果:
tree.xpath("//*[@class='content']")
导致list
的长度= 1。
列表中的第一个(也是唯一)元素-tree.xpath("//*[@class='content']")[0]
是一个lxml.html.HtmlElement
,它本身可以视为列表,并且长度为= 1。
在tail
中第一个(也是唯一一个)元素的lxml.html.HtmlElement
中隐藏了所需的输出...