从HTML获取Open Graph元标记的最快方法?

时间:2013-02-22 23:48:08

标签: python html parsing opengraph lxml

美丽的汤效率不高,所以我尝试使用纯lxml。但是,lxml.html.fromstring是错误的(it suddenly eats 100% RAM after some time),所以我需要以其他方式(不是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]

任何指针都非常感谢!

1 个答案:

答案 0 :(得分:0)

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

  1. 设置块大小(例如1024字节)。
  2. 按块(类似stream.read(1024))读取输入文件块,直到缓冲区中存在</head>(或</HEAD><body>等)。确定限制 - 在输入损坏且没有标题的情况下最大读取的字节数,因此您可以很快放弃消耗大量内存。
  3. 使用lxml.html解析器读取您缓冲的片段(它无效,但无所谓,lxml可以处理它,它不会影响我们的目标。)
  4. 现在,您有lxml DOM对象,其中包含HTML文件的头部。它是有效创建的,没有过多的内存消耗风险。您可以进行任何搜索,提取等。我会使用xpath,但您可以随意使用您在问题中使用的时髦DOM搔痒代码。