美丽的汤效率不高,所以我尝试使用纯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]
任何指针都非常感谢!
答案 0 :(得分:0)
由于OpenGraph标记通常位于HTML文档的开头,因此您只能读取和解析部分输入文件。我认为HEAD
部分巨大的可能性非常小(尽管你的研究可能导致不同的意见,取决于你的样本)。
stream.read(1024)
)读取输入文件块,直到缓冲区中存在</head>
(或</HEAD>
或<body>
等)。确定限制 - 在输入损坏且没有标题的情况下最大读取的字节数,因此您可以很快放弃消耗大量内存。lxml.html
解析器读取您缓冲的片段(它无效,但无所谓,lxml
可以处理它,它不会影响我们的目标。)lxml
DOM对象,其中包含HTML文件的头部。它是有效创建的,没有过多的内存消耗风险。您可以进行任何搜索,提取等。我会使用xpath
,但您可以随意使用您在问题中使用的时髦DOM搔痒代码。