2012-06-08 128 views
-3

可能重複:
Extracting text from HTML file using Python
Parsing Source Code (Python) Approach: Beautiful Soup, lxml, html5lib difference?從HTML標記中提取文本?

目前有大量網頁的源代碼〜20萬線的幾乎所有的(如果不是全部)HTML。更具體地說,它是一個網頁,其內容是通過換行符分隔的幾千個文本塊(雖然換行並不特別意味着內容有分隔)

我的主要目標是從源文本中提取文本代碼就好像我在將網頁複製/粘貼到文本編輯器中一樣。還有另一個我想用的解析函數,它最初採用複製/粘貼文本而不是源代碼。

爲此,我正在使用urllib2,並在Beautiful Soup中調用.get_text()。問題是,Beautiful Soup在我的代碼中留下了大量的空白空間,並且很難將結果傳遞給第二個「文本」解析器。我已經做了很多關於解析HTML的研究,但坦率地說我不知道​​如何輕鬆解決這個問題。此外,我對如何使用像lxml這樣的導入來提取文本感到困惑。

tl;博士:是否有任何可能的方式來實現結果,就像我在網頁上選擇全部,複製,粘貼一樣?

+2

爲了清楚起見,HTML不是源代碼。這是標記。 –

+0

如果你有一個解決方案,但唯一的問題是有太多的空白空間,你不能只刪除額外的空白空間?試試're.sub(r「\ s +」,「」,text)'。 –

+0

- 大衛感謝您的更正! @GregHewgill這將刪除原始網頁中存在的節距否?另一個解析函數在函數中使用這些空白作爲各種分隔符,所以我不想刪除它們。 ): – zhuyxn

回答

0

有你試圖尋找到一個HTML解析器。如果你只是想在html頁面的與出的標籤符號的肉,你可以使用:

from HTMLParser import HTMLParser 

class MyHTMLParser(HTMLParser): 
    def __init__(self): 
     HTMLParser.__init__(self) 
     self.tags = [] 
     self.attrs = [] 
    def handle_starttag(self, tag, attrs): 
     self.tags.append(tag) 
     self.attrs.append(attrs) 
    def handle_endtag(self, tag): 
     if tag not in self.tags:return 
     for x in reversed(self.tags): 
      self.tags.pop() 
      self.attrs.pop() 
      if tag == x:return 
    def handle_data(self, data): 
     print data 

parser = MyHTMLParser() 
f = file("temp.html") 
parser.feed(f.read()) 
f.close() 

這將解析HTML頁面內的數據。 <div><h1>This is my webpage</h1><div></div></div>將被打印爲This is my webpage。您可以修改任何想要顯示不同部分,不同格式等的方法。只需根據您的喜好更改基本類,我的代碼應該讓您開始正確的路徑。