如何使用xpath从lxml获取第一个元素



最小示例:

In [1]: from lxml import etree
In [2]: etree.fromstring('<who>syslogd</who>').xpath('/who/text()')
Out[2]: ['syslogd']

目前我正在使用辅助函数:

def safe_xpath_one(tree: Element, xpath: str) -> Union[Element, None]:
res = tree.xpath(xpath)
if res:
return res[0]

这里我需要检查结果中的第一个元素,这是额外的。是否有直接的方法来指定我想要第一个且唯一的第一个元素?

注:我想我太习惯bs4的soup.select_one

要使用xpathlxml对象中获得第一个元素,可以在xpath查询之后使用[0]索引操作符。例如,如果您有一个名为root的lxml对象,您可以使用以下代码来获取与xpath查询//p匹配的第一个元素:

first_element = root.xpath('//p')[0]

这将返回lxml对象中的第一个p元素。

另一种获得匹配xpath查询的第一个元素的方法是使用find()方法而不是xpath()。例如,您可以使用以下代码来获取lxml对象中的第一个p元素:

first_element = root.find('//p')

这将返回与xpath查询匹配的第一个元素,而不是返回匹配元素的列表。然后,您可以使用标准点表示法访问元素的属性和属性,如下所示:

print (first_element.text)

我不知道这是不是答案,但这就是我目前的做法

from lxml import etree
from functools import partial
def get_xpath_one(tree, xpath):
res = tree.xpath(xpath)
if res:
return res[0]
tree = etree.fromstring('<who>syslogd</who>')
xpath_one = partial(get_xpath_one, tree)
res = xpath_one('/who/text()')
Out: 'syslogd'

最新更新