2013-02-22 40 views
2

美丽的汤不够高效,所以我试图用纯粹的lxml。然而,lxml.html.fromstring是越野车(it suddenly eats 100% RAM after some time),所以我需要做一些其他方式(而不是fromstring)。从HTML获取OpenGraph元标记的最快方法?

我可以使用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

看看'etree.iterparse'。如果使用正确,它运作良好。我在像20MB的RAM中分析了一个10GB的XML文件。 – Blender 2013-02-23 00:27:46

+0

它也适用于HTML吗? – knutole 2013-02-23 21:14:51

+0

不,它没有。 – 2013-04-19 07:27:17

回答

0

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

  1. 设置块大小(例如1024字节)。
  2. 按块读取输入文件块(类似于stream.read(1024)),直到缓冲区中存在</head>(或</HEAD><body>等)。决定限制 - 最多读取的字节数,以防输入损坏并且没有标题等等,所以您可以尽快放弃,消耗大量内存。
  3. 使用lxml.html解析器来读取您缓冲的片段(它是无效的,但没关系,lxml可以处理它,它不会影响我们的目标)。
  4. 现在,您有lxml DOM对象与HTML文件的头部。它是高效创建的,没有过多的内存消耗风险。你可以做任何搜索,提取等。我会使用xpath,但随意使用你的问题中的上述质朴的DOM痒感代码。