lxml etree遍历无法打印标签文本值、无法获取完整标签及Xpath求助
问题原因
lxml 对 XML/HTML 节点的文本存储有特殊规则:直接位于元素开始标签之后、第一个子元素之前的文本会存为元素的text属性;位于元素闭合标签之后、同级下一个元素/父元素闭合标签之前的文本,会存为元素的tail属性。你示例中的Printable String是第二个<a>标签的tail,而非<p>标签的text,因此仅打印e.text无法获取到该内容。
实现方案
1. 匹配期望输出的修改代码
from bs4 import BeautifulSoup from lxml import etree doc = "<p><a></a><a></a>Printable String</p>" soup = BeautifulSoup(doc, "lxml") root = etree.fromstring(str(soup)) tree = etree.ElementTree(root) for i, e in enumerate(root.iter()): print(e.text) # 存在tail属性时额外打印 if e.tail and e.tail.strip(): print(e.tail.strip())
运行后即可输出你预期的结果。
2. 打印元素完整标签
使用etree.tostring方法可以直接输出元素的完整标签内容:
for e in root.iter(): # encoding设为unicode可直接返回字符串,不需要额外解码 full_tag = etree.tostring(e, encoding="unicode").strip() print(full_tag)
3. 获取元素XPath路径
调用ElementTree实例的getpath方法即可直接获取当前元素的XPath:
tree = etree.ElementTree(root) for e in root.iter(): xpath = tree.getpath(e) print(xpath)
内容的提问来源于stack exchange,提问作者Andu Gundu Swami
相关产品推荐
相关产品推荐

