在xpath中进行同级操作后无法正常工作

时间:2019-06-24 15:46:57

标签: python python-3.x selenium xpath lxml

我一直在尝试使用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()

,则无法在selenium webdriver中使用相同的表达式

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

"//*[@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

1 个答案:

答案 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中隐藏了所需的输出...