从HTML获取OpenGraph元标签的最快方式?
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
部分很大概率不会太大(当然,这也要看你的研究结果,可能会有不同的看法,具体取决于你的样本)。
- 设置一个读取的块大小(比如1024字节)。
- 逐块读取输入文件(类似于
stream.read(1024)
),直到在缓冲区中找到</head>
(或者</HEAD>
,或者<body>
等)。要设定一个限制——最大读取的字节数,以防输入文件损坏,没有头部信息,这样你可以尽早放弃,避免消耗过多内存。 - 使用
lxml.html
解析器来读取你缓冲的那部分内容(虽然它不是有效的,但没关系,lxml
可以处理这个问题,而且不会影响我们的目标)。 - 现在,你有了一个
lxml
的DOM对象,里面是HTML文件的头部。这个过程高效且不会造成过多的内存消耗。你可以进行任何搜索、提取等操作。我会使用xpath
,但你也可以用你在问题中提到的其他代码。