gpt4 book ai didi

Python/ElementTree : following-sibling error (working in xpath tester)

转载 作者:行者123 更新时间:2023-11-30 22:44:47 27 4
gpt4 key购买 nike

我有一个简单的 XML 文档(实际上是 Evernote 的 ENML),如下所示:

<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
<en-note>
<div>Here is the Evernote logo:</div>
<div>
<en-media type="image/png" hash="a54fe8bcd146e20a8a5742834558543c" />
</div>
<div>
<br />
</div>
<div>
<en-todo />
Task 1
</div>
<div>making it a bit harder</div>
<div>
<en-todo />
Task 2 | 2016-12-31
</div>
<div>
<br />
</div>
<div>
This is another to-do
<en-todo />
in an awkward place
</div>
</en-note>

我正在尝试使用 Xpath 立即访问 en-todo 之后的文本标签。我的代码是:

parsed_note = ElementTree.fromstring(note_content)
for todo in parsed_note.findall('en-note//en-todo/following-sibling::text()[1]'):
print todo.text

我已经使用 freeformatter.com 上的 Xpath 测试器对此进行了测试 - 它似乎有效,但仅当我删除 <!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"> 时才有效。来自 XML 的标记 - 我认为这是测试人员的一个怪癖。输出为:

Text='Task 1'
Text='Task 2 | 2016-12-31'
Text='in an awkward place'

这完全符合预期和期望。

当我尝试在 Python 中运行代码时,我得到:SyntaxError: prefix 'following-sibling' not found in prefix map .

我怀疑这可能是与测试人员相同的怪癖,并删除了文件类型标签,但相同的错误仍然存​​在。

我正在使用标准解析器:

import defusedxml.lxml as lxml
from lxml import etree as ElementTree

我哪里出错了 - 我的 xpath 语句是否有缺陷,或者是否还有其他我遗漏的原因?

编辑:@Tomalek 提供了一个有效的解决方案,使用 Python tail函数而不是完整的 xpath。鉴于 @alecxe 的评论,所引用的文档不适用于 lxml,我将保留此开放状态,以防有人想冒险了解为什么在应该有完整的 xpath 实现时存在原始问题。

最佳答案

您应该使用xpath()方法:

for todo in root.xpath('//en-note//en-todo/following-sibling::text()[1]'):
print todo

另请注意 - 我在开头添加了 // 并删除了 .text - 您已经获得了文本节点 - 它们没有.text 属性。

关于Python/ElementTree : following-sibling error (working in xpath tester),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41409413/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com