【问题标题】:Python 3 XML parser unkown entity errorPython 3 XML 解析器未知实体错误
【发布时间】:2015-02-21 14:49:21
【问题描述】:

但是我在这里找到了很多答案,不幸的是,它们对我不起作用。

我有 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. 是否可以不手动添加每个实体以防止解析错误?

【问题讨论】:

    标签: python html xml parsing


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2011-04-17
      • 2011-11-06
      • 2011-06-14
      • 2012-10-27
      • 2021-11-28
      • 1970-01-01
      • 2015-05-09
      • 2011-09-06
      • 1970-01-01
      相关资源
      最近更新 更多