lxml提取XML文本问题:如何获取title节点内的目标文本
解决lxml提取title节点内目标文本的问题
你的问题出在:title.text只能获取<title>标签后第一个子节点(也就是第一个<indexmarker>)之前的空白内容,而你要的Text Here是最后一个<indexmarker>节点的tail属性值——因为它是紧跟在该子节点后的文本内容。
下面是两种不修改XML结构的解决方案:
方法一:直接获取最后一个indexmarker的tail文本
这种方法精准定位目标文本所在的位置:
from lxml import etree xml = '''<root> <title> <indexmarker marker="AAA"/> <indexmarker marker="BBB"/> <indexmarker marker="CCC"/>Text Here </title> </root>''' root = etree.fromstring(xml) titles = root.findall('title') title = titles[0] # 找到title下所有indexmarker节点,取最后一个的tail last_marker = title.findall('indexmarker')[-1] target_text = last_marker.tail.strip() # strip()去除文本前后的空白字符 print(target_text) # 输出: Text Here
方法二:提取title节点下所有文本内容并整理
如果title节点内除了目标文本外没有其他多余文本,这种方法更通用:
from lxml import etree xml = '''<root> <title> <indexmarker marker="AAA"/> <indexmarker marker="BBB"/> <indexmarker marker="CCC"/>Text Here </title> </root>''' root = etree.fromstring(xml) titles = root.findall('title') title = titles[0] # 遍历title节点下所有文本节点(包括text和tail)并拼接 all_text = ''.join(title.itertext()).strip() print(all_text) # 输出: Text Here
补充说明
在lxml的元素模型里:
- 元素的
text属性:仅存储该元素开始标签与第一个子元素(或结束标签)之间的文本 - 元素的
tail属性:存储该元素结束标签与下一个元素(或父元素结束标签)之间的文本
你之前尝试的title.attrib等方法,都是针对元素属性的操作,自然拿不到文本内容。
内容的提问来源于stack exchange,提问作者baconm
相关产品推荐
相关产品推荐

