用python和lxml解析大型HTML文件并提取信息

3 投票
1 回答
2116 浏览
提问于 2025-04-18 09:18

我想要解析大型的HTML文件,并通过xpath从这些文件中提取信息。为此,我正在使用Python和lxml库。不过,lxml在处理大文件时似乎不太好用,它能正确解析的文件大小大约不能超过16MB。下面这段代码是它尝试通过xpath从HTML代码中提取信息的部分:

tree = lxml.html.fragment_fromstring(htmlCode)
links = tree.xpath("//*[contains(@id, 'item')]/div/div[2]/p/text()")

变量htmlCode包含了从文件中读取的HTML代码。我还尝试过使用parse方法来从文件中读取代码,而不是直接从字符串获取,但也没有成功。因为文件的内容能够成功读取,所以我觉得问题可能和lxml有关。我一直在寻找其他库来解析HTML并使用xpath,但看起来lxml是主要用来做这个的库。

有没有其他lxml的方法或函数可以更好地处理大型HTML文件呢?

1 个回答

2

如果文件非常大,你可以使用 iterparse 方法,并添加 html=True 这个参数,这样就可以在不进行任何验证的情况下解析文件。你需要手动创建 xpath 的条件。

from lxml import etree
import sys
import unicodedata

TAG = '{http://www.mediawiki.org/xml/export-0.8/}text'

def fast_iter(context, func, *args, **kwargs):
    # http://www.ibm.com/developerworks/xml/library/x-hiperfparse/
    # Author: Liza Daly
    # modified to call func() only in the event and elem needed
    for event, elem in context:
        if event == 'end' and elem.tag == TAG:
            func(elem, *args, **kwargs)
        elem.clear()
        while elem.getprevious() is not None:
            del elem.getparent()[0]
    del context

def process_element(elem, fout):
    global counter
    normalized = unicodedata.normalize('NFKD', \
            unicode(elem.text)).encode('ASCII','ignore').lower()
    print >>fout, normalized.replace('\n', ' ')
    if counter % 10000 == 0: print "Doc " + str(counter)
    counter += 1

def main():
    fin = open("large_file", 'r')
    fout = open('output.txt', 'w')
    context = etree.iterparse(fin,html=True)
    global counter
    counter = 0
    fast_iter(context, process_element, fout)

if __name__ == "__main__":
main()

来源

撰写回答