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

标签 python html xpath

我想解析大型 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()

Source

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

相关文章:

Python 列表理解仅适用于特定顺序

python - 使用不同的轴类型绘制多个图

python - 绘制分组日期时间 - Pandas

html - 使用 HTML 和 CSS 创建 4x5 图像网格

xml - 带条件的 xpath 计数

python - numpy in1d 返回不正确的结果?

javascript - 获取 Twitter Bootstrap 导航栏以加载不同的页面,而不仅仅是引用同一页面上的 div

html - 布局 anchor 、图像和 div 的正确方法

html - XPath 和 CSS 查询算法的区别

java - 等待页面元素(xpath)在 Selenium Webdriver 中显示的最有效方法是什么?