Python3 XML解析器未知实体错误
然而,我在这里找到了很多答案,不幸的是,它们不适合我 我有Ubuntu x64,python 3.4.2 我正在解析包含html实体的网页,如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
等:
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)