[英]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.