我想解析大型 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()
关于python - 使用 python 和 lxml 从大型 HTML 文件中解析和提取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24144855/