2

Beautiful Soup 效率不够高,所以我尝试使用 pure lxml。但是,这lxml.html.fromstring是错误的(一段时间后它突然吃掉了 100% 的 RAM),所以我需要以其他方式(而不是fromstring)。

我可以使用 API 中的任何其他模块吗?我想不通,互联网上的例子令人惊讶地接近于零。

这就是我现在正在做的事情,但正如我所说,我需要替换fromstring

        mySearchTree = fromstring(data)
        metas = {}
        n = -1
        for a in mySearchTree.cssselect('meta'):
            n += 1
            metas[n] = {}
            for b in a.items():
                metas[n][b[0]] = b[1]
        y = 0
        tag = []
        for m in metas:
            if 'property' in metas[m] and 'content' in metas[m]:
                if 'og:' in metas[m]['property']:
                    y += 1
                    tag.append({metas[m]['property'] : metas[m]['content']})

        for x in tag:
            for y in x:
                #print '%s ==> %s' % (y, x[y])
                self.rj[y] = x[y]

任何指针都非常感谢!

4

1 回答 1

2

由于 OpenGraph 标签通常位于 HTML 文档的开头,因此您只能读取和解析输入文件的一部分。我认为该部分很大的可能性HEAD非常小(尽管您的研究可能会导致不同的意见,这取决于您的样本)。

  1. 设置块大小(例如 1024 字节)。
  2. 逐块读取输入文件(类似于stream.read(1024)),直到缓冲区中存在</head>(或</HEAD>,或<body>等)。决定限制 - 在输入损坏并且没有标头左右的情况下最大读取的字节数,因此您可以尽快放弃消耗大量内存。
  3. 使用lxml.html解析器读取你缓存的片段(无效,但没关系,lxml可以处理,不会影响我们的目标)。
  4. 现在,您有了lxml带有 HTML 文件头部的 DOM 对象。它是高效创建的,没有过多内存消耗的风险。您可以进行任何搜索、提取等。我会使用xpath,但请随意使用您在问题中上面的时髦 DOM 挠痒痒代码。
于 2013-04-19T07:40:43.590 回答