繁体   English   中英

使用python和lxml从大型HTML文件中解析和提取信息

[英]Parsing and extracting information from large HTML files with python and lxml

我想解析大型HTML文件并通过xpath从这些文件中提取信息。 为了做到这一点,我正在使用python和lxml。 但是,lxml似乎不适用于大文件,它可以正确解析大小不超过16 MB的文件。 尝试通过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文件?

如果文件非常大,您可以使用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()

资源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM