Python LXML 解析 Evernote XML 时出错

2 投票
2 回答
1292 浏览
提问于 2025-04-17 17:15

我正在尝试用 Python 2.7 和 lxml 库来解析 Evernote 标记语言(ENML)。ENML 是 XHTML 的一个扩展。

from StringIO import StringIO
import lxml.etree as etree

if __name__ == '__main__':
    xml_str = StringIO('<?xml version="1.0" encoding="UTF-8"?>\r\n<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">\r\n\r\n<en-note style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">\nA really simple example. &nbsp;Another sentence.\n</en-note>')
    tree = etree.parse(xml_str)

上面的代码出现了错误,错误信息是:

XMLSyntaxError: Entity 'nbsp' not defined, line 5, column 32

我该如何成功解析 ENML 呢?

2 个回答

0

你可以试着用数字值来替换实体名称。

http://www.w3schools.com/tags/ref_entities.asp

3

在HTML解析器中,&nbsp;是可以被识别的,但在XML解析器中就不行了。

from StringIO import StringIO
import lxml.html as LH
if __name__ == '__main__':
    xml_str = StringIO('<?xml version="1.0" encoding="UTF-8"?>\r\n<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">\r\n\r\n<en-note style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">\nA really simple example. &nbsp;Another sentence.\n</en-note>')
    tree = LH.parse(xml_str)
    print(LH.tostring(tree))

撰写回答