2013-02-22 62 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癢感代碼。