gpt4 book ai didi

python - 迭代解析 HTML(使用 lxml?)

转载 作者:太空狗 更新时间:2023-10-30 00:33:32 27 4
gpt4 key购买 nike

我目前正在尝试以迭代方式解析一个非常大的 HTML 文档(我知道......该死)以减少使用的内存量。我遇到的问题是我收到 XML 语法错误,例如:

lxml.etree.XMLSyntaxError:重新定义属性名称,第 134 行,第 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'

最佳答案

完美的解决方案最终成为 Python 自己的 HTMLParser [docs] .

这是我最终使用的(相当糟糕的)代码:

class MyParser(HTMLParser):
def __init__(self):
self.finished = False
self.in_table = False
self.in_row = False
self.in_cell = False
self.current_row = []
self.current_cell = ''
HTMLParser.__init__(self)

def handle_starttag(self, tag, attrs):
attrs = dict(attrs)
if not self.in_table:
if tag == 'table':
if ('id' in attrs) and (attrs['id'] == 'dgResult'):
self.in_table = True
else:
if tag == 'tr':
self.in_row = True
elif tag == 'td':
self.in_cell = True
elif (tag == 'a') and (len(self.current_row) == 7):
url = attrs['href']
self.current_cell = url


def handle_endtag(self, tag):
if tag == 'tr':
if self.in_table:
if self.in_row:
self.in_row = False
print self.current_row
self.current_row = []
elif tag == 'td':
if self.in_table:
if self.in_cell:
self.in_cell = False
self.current_row.append(self.current_cell.strip())
self.current_cell = ''

elif (tag == 'table') and self.in_table:
self.finished = True

def handle_data(self, data):
if not len(self.current_row) == 7:
if self.in_cell:
self.current_cell += data

使用该代码我可以这样做:

parser = MyParser()
for line in myfile:
parser.feed(line)

关于python - 迭代解析 HTML(使用 lxml?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8477627/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com