【发布时间】:2016-12-31 15:08:00
【问题描述】:
我有一个简单的 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 测试器对此进行了测试——它似乎有效,但只有当我从 XML 中删除 <!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"> 标记时——我认为这是测试器的一个怪癖。输出是:
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 的 cmets 所引用的文档不适用于 lxml,我将保持开放状态,以防有人想冒险了解为什么在应该有完整的 xpath 实现时存在原始问题。
【问题讨论】:
标签: python xml xpath lxml elementtree