【问题标题】:xpath TypeError: 'lxml.etree._ElementTree' object is not iterablexpath TypeError:“lxml.etree._ElementTree”对象不可迭代
【发布时间】:2021-02-14 05:20:13
【问题描述】:

尽可能简单:

<state name = "foo1>
    <foobar item1="something1" item2="somethingelse1" item3="usefulitem1"/>
    <foobar item1="something2" item2="somethingelse2" item3="usefulitem2"/>
<state name = "foo2">
...
root = lxml.etree.parse(fileName)
path = "./*[contains(text(),'useful')]"
someElement = root.xpath(path)

我正在尝试列出所有 foobar 的列表,这些 foobar 中的某处包含一些带有“有用”文本的项目。我不断收到错误 TypeError: 'lxml.etree._ElementTree' object is not iterable

【问题讨论】:

  • 仍然不是minimal reproducible example。 “XML”甚至不是格式正确的。
  • 对不起,当我打开我的 XML 时,这就是我所看到的。我不知道我还能得到多少

标签: python xml xml-parsing


【解决方案1】:

我实际上认为您可以从树对象中获取 XPath。嗯。但是你绝对不能迭代它。为此,您需要获取根(元素)。

来自文档:

getroot(self)
获取这棵树的根元素。

所以你的代码看起来应该是这样的。

<state name = "foo1>
    <foobar item1="something1" item2="somethingelse1" item3="usefulitem1"/>
    <foobar item1="something2" item2="somethingelse2" item3="usefulitem2"/>
<state name = "foo2">
...
tree = lxml.etree.parse(fileName)
root = tree.getroot()
path = "./*[contains(text(),'useful')]"
someElement = root.xpath(path)

棘手的是,当您使用 .fromstring 而不是文件时,您会自动拥有根元素,而不是 ElementTree

【讨论】:

  • 但我同意您的 xml 文件看起来很奇怪。我本来希望这个问题更像:stackoverflow.com/questions/4531995/…
  • tree.getroot() 不是必需的。 xpath() 方法适用于 ElementElementTree 对象。
猜你喜欢
  • 2020-12-05
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 2017-08-27
  • 2018-10-10
  • 2021-12-13
  • 2019-02-20
相关资源
最近更新 更多