Python 如何获取文本节点的所有者元素?
我有以下数据:Python 如何获取文本节点的所有者元素?,python,xpath,lxml,Python,Xpath,Lxml,我有以下数据: <data> <foo>foo text</foo> data text <bar> bar text <baz>text</baz> <baz>text</baz> bar text </bar> data text </data> 输出为: foo text bar text b
<data>
<foo>foo text</foo>
data text
<bar>
bar text
<baz>text</baz>
<baz>text</baz>
bar text
</bar>
data text
</data>
输出为:
foo text
bar text
bar text
baz text
baz text
但我需要:
foo text
data text
bar text
baz text
baz text
bar text
data text
如何按顺序获取节点的text()
,而不丢失数据文本
文本
编辑
我知道etree.xpath(“.//text()”)
可以按顺序给我所有文本,但是
我需要修改
baz
标记内的文本。这是一点。如何获取//text()
XPath的每个元素的标记值?假设您使用的是lxml
,您可以调用getparent()
函数来获取文本节点的所有者元素,例如:
import lxml.etree
etree = lxml.etree.fromstring('''
<data>
<foo>foo text</foo>
data text
<bar>
bar text
<baz>text</baz>
<baz>text</baz>
bar text
</bar>
data text
</data>
''')
for text in etree.xpath("//text()[normalize-space()]"):
parenttag = text.getparent().tag
print(parenttag, text)
我的问题解决了,tnx。但我有一个简短的问题。为什么“数据文本”的父标记值为“foo”和“bar”?我想一定是“数据”标签。看起来它不是父标记,只是可以在中找到以前对该行为的完整解释
import lxml.etree
etree = lxml.etree.fromstring('''
<data>
<foo>foo text</foo>
data text
<bar>
bar text
<baz>text</baz>
<baz>text</baz>
bar text
</bar>
data text
</data>
''')
for text in etree.xpath("//text()[normalize-space()]"):
parenttag = text.getparent().tag
print(parenttag, text)
('foo', 'foo text')
('foo', '\n data text\n ')
('bar', '\n bar text\n ')
('baz', 'text')
('baz', 'text')
('baz', '\n bar text\n ')
('bar', '\n data text\n')