Python 3 XML解析器未知实体错误

时间:2014-12-23 12:49:18

标签: python html xml parsing

但是我在这里找到了很多答案,不幸的是,他们不适合我。

我有Ubuntu x64,python 3.4.2。

我正在解析一个包含 等html实体的网页:

import xml.etree.ElementTree as ET
page = 'some string I get from requests.get'
parser = ET.XMLParser()
parser.parser.UseForeignDTD(True)
tree = ET.fromstring(page, parser=parser)

许多答案都包含此代码,以防止unknown entity &nbps;之类的错误。当我编译此代码时,它会抛出一个错误:

AttributeError: 'xml.etree.ElementTree.XMLParser' object has no attribute 'parser'

AttributeError: 'xml.etree.ElementTree.XMLParser' object has no attribute '_parser'

(在上面的代码中代表我在第4行写的parser对象的成员。神奇的是,当我尝试从PyCharm IDE转到此代码时,它向我显示该成员是存在的并且在类构造函数中成功创建:

# underscored names are provided for compatibility only
self.parser = self._parser = parser
self.target = self._target = target

我的问题是:

  1. 为什么这不起作用?
  2. 是否可以不手动添加每个实体以防止解析错误?

1 个答案:

答案 0 :(得分:1)

我今天遇到了同样的问题,尽管我使用的是Python 2.7.3。据我所知,这在你第一次尝试时确实有效,但在某些时候,解析器确实失去了它的_parser属性。如果您可以在抛出此异常的位置检查该对象,而不是在创建时检查该对象,那么您将看到它没有说谎。

令人讨厌我无法弄清楚这是怎么发生的。我试图对XMLParser.feed()方法进行修补,这就是抛出此异常的原因:

def feed(self, data):
    try:
        self._parser.Parse(data, 0)
    except self._error, v:
        self._raiseerror(v)

删除_,因为parser属性确实存在,并且应与_parser相同。但后来我开始收到错误,表明解析器仍在执行先前fromstring调用的状态。

相反,最终对我有用的是每次我需要时简单地重新创建XMLParser对象,即

class DecodeEntities:
    def __getitem__(self, key):
        if key in name2codepoint:
            return unichr(name2codepoint[key])
        else:
            # Note that this removes unrecognised entities
            return ''

class Parse:
    def from_unicode(self, unic):
        # We also want the parser to understand HTMLX entities.
        # Note that this has to be created every time - reusing a
        # parser appears not to be possible.
        parser = ElementTree.XMLParser()
        parser.parser.UseForeignDTD(True)
        parser.entity = DecodeEntities()

        ret = ElementTree.fromstring(unic, parser=parser)