Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3 XML解析器未知实体错误_Python_Html_Xml_Parsing - Fatal编程技术网

Python3 XML解析器未知实体错误

Python3 XML解析器未知实体错误,python,html,xml,parsing,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=pars

然而,我在这里找到了很多答案,不幸的是,它们不适合我

我有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)
许多答案包含此代码,以防止出现错误,如
未知实体&nbps。当我编译此代码时,它会抛出一个错误:

AttributeError:'xml.etree.ElementTree.XMLParser'对象没有属性“parser”

AttributeError:'xml.etree.ElementTree.XMLParser'对象没有属性'\u parser'

(我在上面代码的第4行中写的
解析器
对象的哪个成员)。神奇的是,当我尝试从
PyCharm
IDE转到此代码时,它向我显示此成员存在并成功创建了类内构造函数:

# underscored names are provided for compatibility only
self.parser = self._parser = parser
self.target = self._target = target
我的问题是:

  • 为什么这不起作用
  • 是否可以不手动添加每个实体以防止分析错误

  • 虽然我使用的是Python 2.7.3,但今天我自己也遇到了同样的问题。就我所见,这在您第一次尝试它时确实起作用,但在某些时候,解析器确实丢失了它的
    \u parser
    属性。如果您可以在对象抛出此异常的点而不是在创建时检查对象,那么您将看到它没有说谎

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

    def feed(self, data):
        try:
            self._parser.Parse(data, 0)
        except self._error, v:
            self._raiseerror(v)
    
    删除
    \uu
    ,因为
    解析器
    属性确实保留,并且应该与
    \u解析器
    相同。但随后我开始发现错误,表明解析器仍然携带来自上一次
    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)