我目前正在尝试使用 lxml.etree.iterparse
迭代解析一个非常大的HTML文档(我知道...很糟糕):
增量解析器。以SAX方式将XML解析为树并生成元组(event, element)
我正在使用增量/迭代/SAX方法来减少内存使用量(我不想将HTML加载到DOM/tree中,因为文件太大)。
问题在于,我遇到了XML语法错误,例如:
lxml.etree.XMLSyntaxError: Attribute name redefined, line 134, column 59
这就导致所有操作都停止了。
有没有一种方法可以在迭代解析HTML时避免出现语法错误?
目前我从XML语法错误异常中提取行号,然后将该行从文档中删除,然后重新开始整个过程。看起来这是一种相当恶心的解决方案。有更好的方法吗?
编辑:
这是我目前的做法:
context = etree.iterparse(tfile, events=('start', 'end'), html=True)
in_table = False
header_row = True
while context:
try:
event, el = context.next()
# do something
# remove old elements
while el.getprevious() is not None:
del el.getparent()[0]
except etree.XMLSyntaxError, e:
print e.msg
lineno = int(re.search(r'line (\d+),', e.msg).group(1))
remove_line(tfilename, lineno)
tfile = open(tfilename)
context = etree.iterparse(tfile, events=('start', 'end'), html=True)
except KeyError:
print 'oops keyerror'
html
为真且未指定recover
,则recover
将会是 True,正如文档中所述:“recover: try hard to parse through broken input (default: True for HTML)” 对于iterparse
http://lxml.de/api/lxml.etree.iterparse-class.html - Nate Andersonlxml
版本2.3并没有recover
参数。根据版本3.3中的代码,可以看出recover
参数是在lxml
中引入的(发布于2014年1月)。所以感谢@Pawel指出了recover
参数!(但OP无需更改其代码(他们使用html=True
),只需更新lxml
即可!) - Nate Anderson