从HTML获取OpenGraph元标签的最快方式?

2 投票
1 回答
1363 浏览
提问于 2025-04-17 16:49

Beautiful Soup 这个库效率不够高,所以我想用纯粹的 lxml。不过,lxml.html.fromstring 有点问题(它过一段时间后会突然占用100%的内存),所以我需要找其他方法来处理(不是用 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 个回答

2

因为OpenGraph标签通常位于HTML文档的开头,所以你可以只读取和解析输入文件的一部分。我觉得HEAD部分很大概率不会太大(当然,这也要看你的研究结果,可能会有不同的看法,具体取决于你的样本)。

  1. 设置一个读取的块大小(比如1024字节)。
  2. 逐块读取输入文件(类似于stream.read(1024)),直到在缓冲区中找到</head>(或者</HEAD>,或者<body>等)。要设定一个限制——最大读取的字节数,以防输入文件损坏,没有头部信息,这样你可以尽早放弃,避免消耗过多内存。
  3. 使用lxml.html解析器来读取你缓冲的那部分内容(虽然它不是有效的,但没关系,lxml可以处理这个问题,而且不会影响我们的目标)。
  4. 现在,你有了一个lxml的DOM对象,里面是HTML文件的头部。这个过程高效且不会造成过多的内存消耗。你可以进行任何搜索、提取等操作。我会使用xpath,但你也可以用你在问题中提到的其他代码。

撰写回答