但是我在这里找到了很多答案,不幸的是,他们不适合我。
我有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
我的问题是:
答案 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)