2010-10-26 118 views
0

我正在使用urllib在web分析器上工作。我需要只能保存位於特定div標記內的行。例如:我將所有文本保存在div「body」中。這意味着div標籤內的所有文本都會被返回。這也意味着如果其中有其他div,那很好,但只要我打到父母,它就會停下來。有任何想法嗎?只選擇div標籤內的文本

我的想法

  1. 搜索你的期待 股利。

  2. 記錄位置。

  3. 跟蹤 未來的任何div。 +1爲新div -1結尾 div。

  4. 當回到0時,你的父母在 div?保存位置。

  5. 然後保存數據從beginnning 號碼到結束號碼?

回答

3

如果你不是你自己解析HTML代碼的想法真的很興奮,有兩個很好的選擇:

Beautiful Soup

Lxml

你可能會發現, lxml的運行速度比BeautifulSoup快,但在我的使用中,Beautiful Soup非常容易學習和使用,並處理了在野外發現的典型蹩腳HTML,足以讓我無需其他任何東西。

YMMV。

+1

男人我愛美麗的女孩 – JudoWill 2010-10-26 18:43:08

3

使用lxml

import lxml.html as lh 
content='''\ 
<body> 
<div>AAAA 
    <div>BBBB 
    <div>CCCC 
    </div>DDDD 
    </div>EEEE 
</div>FFFF 
</body> 
''' 
doc=lh.document_fromstring(content) 
div=doc.xpath('./body/div')[0] 
print(div.text_content()) 
# AAAA 
# BBBB 
#  CCCC 
#  DDDD 
# EEEE 

div=doc.xpath('./body/div/div')[0] 
print(div.text_content()) 
# BBBB 
#  CCCC 
#  DDDD 
0

我個人更喜歡LXML一般,但有時它的HTML處理是有點過了......這裏有一個BeautifulSoup配方是否有幫助。

from BeautifulSoup import BeautifulSoup, NavigableString 

def printText(tags): 
    s = [] 
    for tag in tags : 
     if tag.__class__ == NavigableString : 
      s.append(tag) 
     else : 
      s.append(printText(tag)) 
    return "".join(s) 

html = "<html><p>Para 1<div class='stuff'>Div Lead<p>Para 2<blockquote>Quote 1</div><blockquote>Quote 2" 
soup = BeautifulSoup(html) 

v = soup.find('div', attrs={ 'class': 'stuff'}) 

print v.text_content