【问题标题】:Get a single child note using lxml使用 lxml 获取单个子注释
【发布时间】:2022-01-07 07:50:22
【问题描述】:

编辑 - 问题是我运行的是过时版本的 lxml - 我现在觉得自己很愚蠢,但我很高兴我发现了。

我在遍历 XML 树以导出单个子元素时遇到问题。

我正在寻找的是隔离子元素并将它们导出到单独的 xml 文件中。但我的问题是,当我使用“etree.iter”函数时,我不仅得到了子元素,还得到了所有后续的兄弟姐妹。我怎样才能一次只获取一个子元素?

这应该更好地解释它。这是我的示例代码:

from lxml import etree

root = etree.XML("<users><user><name>Test</name><id>01</id></user> \
                         <user><name>Test</name><id>02</id></user> \
                         <user><name>Test</name><id>03</id></user></users>")

for record in root.iter("user"):
    print(etree.tostring(record))

它产生以下输出

b'<user><name>Test</name><id>01</id></user><user><name>Test</name><id>02</id></user><user><name>Test</name><id>03</id></user></users>'
b'<user><name>Test</name><id>02</id></user><user><name>Test</name><id>03</id></user></users>'
b'<user><name>Test</name><id>03</id></user></users>'

但我需要的是

b'<user><name>Test</name><id>01</id></user>'
b'<user><name>Test</name><id>02</id></user>'
b'<user><name>Test</name><id>03</id></user>'

我做错了什么?

【问题讨论】:

  • 我尝试使用 xpath,但遇到了同样的问题:records = root.xpath('//user'),然后使用for record in records: 遍历它们,但这会产生完全相同的结果。
  • 对我来说很好用(版本 4.6.4)
  • 将 lxml 更新到 4.6.4 后已解决。感谢您的帮助!

标签: python lxml


【解决方案1】:

不太清楚为什么iter 会产生这样的错误。试试这个,效果很好。

xn = etree.fromstring("<users><user><name>Test</name><id>01</id></user><user><name>Test</name><id>02</id></user><user><name>Test</name><id>03</id></user></users>")
user_nodes = xn.findall("user")
str_nodes = [etree.tostring(un) for un in user_nodes]
print(str_nodes)

产生预期的输出

[
b'<user><name>Test</name><id>01</id></user>', 
b'<user><name>Test</name><id>02</id></user>', 
b'<user><name>Test</name><id>03</id></user>']

【讨论】:

  • 谢谢!我也尝试过使用它,但它没有用。我开始认为我的设置有问题,因为当我运行您的确切代码时,我得到 [b'&lt;user&gt;&lt;name&gt;Test&lt;/name&gt;&lt;id&gt;01&lt;/id&gt;&lt;/user&gt;&lt;user&gt;&lt;name&gt;Test&lt;/name&gt;&lt;id&gt;02&lt;/id&gt;&lt;/user&gt;&lt;user&gt;&lt;name&gt;Test&lt;/name&gt;&lt;id&gt;03&lt;/id&gt;&lt;/user&gt;&lt;/users&gt;', b'&lt;user&gt;&lt;name&gt;Test&lt;/name&gt;&lt;id&gt;02&lt;/id&gt;&lt;/user&gt;&lt;user&gt;&lt;name&gt;Test&lt;/name&gt;&lt;id&gt;03&lt;/id&gt;&lt;/user&gt;&lt;/users&gt;', b'&lt;user&gt;&lt;name&gt;Test&lt;/name&gt;&lt;id&gt;03&lt;/id&gt;&lt;/user&gt;&lt;/users&gt;'] !我正在使用带有 Python 3.9.7 的 Jupyter Notebook
  • lxml 版本为 4.6.3
  • 这是在 Py 3.8 / lxml - 3.6.4 上尝试过的。
  • 确实是lxml的版本问题!没有早点意识到这一点,我感到非常愚蠢。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多