【问题标题】:Parsing evernote xml with element tree on python: how to find/delete elements with specific tag name在python上使用元素树解析evernote xml:如何查找/删除具有特定标签名称的元素
【发布时间】:2014-04-28 01:43:07
【问题描述】:

我想从evernote note on xml 中获取所有与 en-todo 元素相关的文本。是否有任何功能可以通过一行从根目录获取具有特定名称的所有标签?

我试过 root.findall("en-todo"),但它什么也没返回。

典型的印象笔记可以包含具有不同嵌套级别的 en-todo 元素。 En-todo 标签通常在 span 标签内,尽管有时整个堆栈 en-todo 和文本可以在该 span 标签内。这使解析变得相当复杂。
有没有什么简单的方法可以从 xml 中删除所有 span 标签并保留其子级?你能建议任何其他解决方案吗?

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE en-note SYSTEM
"http://xml.evernote.com/pub/enml2.dtd">
<en-note>
<div>
<en-todo></en-todo>
<span>one task</span>
</div>

<div><span><br clear="none"/></span></div>

<div><span>
<en-todo></en-todo>
<span>second task</span>
<br clear="none"/>
<span><en-todo></en-todo>third task</span>
<br clear="none"/>
<span><en-todo></en-todo>forth task</span>
<br clear="none"/>
<span><en-todo></en-todo>fifth task</span>
</span></div>
...

【问题讨论】:

    标签: python xml-parsing tags elementtree evernote


    【解决方案1】:

    通过 xpath 获取:

    root.findall('.//en-todo')
    

    这将找到任何嵌套级别的所有 en-todo 元素。

    【讨论】:

    • 谢谢,它正在工作!如果您也可以给我关于 span 标签的提示,我会很高兴。有什么简单的方法可以检测一个标签接着另一个标签吗?就像我上面代码中的第二个任务一样,我希望获取 span 标签文本值,考虑到这是 en-todo 的一种例外情况(例如,对于第 3、第 4、第 5 个任务,我可以只使用 element.tail)。
    • @ivanovaos 据我了解,您需要获取节点的下一个后续兄弟节点。我不确定它是否可以轻松地使用 elementtree。你可以切换到lxml吗?
    • 我会的,只要系统给我机会,我需要收集15点声望……是的,你对元素的理解是正确的。我不能切换,不幸的是。无论如何,感谢您的帮助!
    • @ivanovaos 试试 //en-todo/following-sibling::span[1] xpathtester.com/xpath/293f6096fee51198e05af8c69aa1b7b0 它将获得 en-todo 标签之后的第一个跨度。我想这就是你想要的(?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2018-01-18
    • 1970-01-01
    相关资源
    最近更新 更多