Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取文本节点的所有者元素?_Python_Xpath_Lxml - Fatal编程技术网

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')