如何通过XPath直接获取lxml中的首个元素?
lxml 获取首个匹配元素的方案
你可以通过以下几种方式实现类似bs4 select_one的效果,无需自己编写辅助函数:
1. 用XPath表达式直接限定首个结果
XPath支持用[1]索引(注意XPath索引从1开始)来获取匹配的第一个节点,结合next()函数可以安全获取结果(无匹配时返回None):
from lxml import etree tree = etree.fromstring('<who>syslogd</who>') # 获取首个文本节点,无匹配则返回None text = next(iter(tree.xpath('/who/text()[1]')), None)
2. 使用lxml内置的find()/findtext()方法
Element对象自带的find()方法接收XPath表达式,直接返回第一个匹配的元素节点,无匹配则返回None,完全贴合你想要的select_one用法:
from lxml import etree tree = etree.fromstring('<who>syslogd</who>') # 获取首个元素节点 target_element = tree.find('/who') # 直接获取节点文本,无匹配则返回None target_text = tree.findtext('/who')
3. 用CSS选择器实现类似select_one
如果习惯bs4的CSS选择器语法,可以借助lxml的cssselect扩展,搭配next()函数实现:
from lxml import etree from lxml.cssselect import CSSSelector tree = etree.fromstring('<who>syslogd</who>') selector = CSSSelector('who') # 获取首个匹配元素,无匹配则返回None target_element = next(selector(tree), None)
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

