2017-08-17 337 views
0

我正在嘗試構建抓取頁面上所有鏈接並將其添加到文件的網絡抓取工具。解析網頁抓取器中的HTML頁面

我的Python代碼中包含執行以下操作的方法: -

  1. 打開一個給定的網頁(urllib2的模塊被使用)

  2. 檢查該HTTP報頭內容類型包含text/html

  3. 將原始HTML響應轉換爲可讀代碼並將其存儲到html_string變量。

  4. 然後,它創建一個Link_Finder類,它具有屬性基url(Spider_url)和page url(page_url)的實例。 Link_Finder在另一個模塊link_finder.py中定義。
  5. html_string然後被饋送到使用饋送功能的類。

Link_Finder類在下面詳細解釋。

def gather_links(page_url):  #page_url is relative url 
     html_string='' 
     try : 
      req=urllib2.urlopen(page_url) 
      head=urllib2.Request(page_url) 
      if 'text/html' in head.get_header('Content-Type'):    
       html_bytes=req.read() 
       html_string=html_bytes.decode("utf-8") 
      finder=LinkFinder(Spider.base_url,page_url) 
      finder.feed(html_string)    
     except Exception as e: 
      print "Exception " + str(e) 
      return set() 
     return finder.page_links() 

的link_finder.py模塊使用標準的Python 的HTMLParser裏urlparse模塊。類Link_Finder從的HTMLParser繼承和覆蓋handle_starttag功能讓所有的一個標籤與href屬性並添加URL的一組(self.queue)

from HTMLParser import HTMLParser 
import urlparse  
class LinkFinder(HTMLParser): 
    def __init__(self,base_url,page_url):  #page_url is relative url 
     super(LinkFinder,self).__init__()  
     self.base_url=base_url 
     self.page_url=page_url 
     self.links=set() 
    def handle_starttag(self,tag,attrs): #Override default handler methods 
     if tag==a: 
      for(key,value) in attrs: 
       if key=='href': 
        url=urlparse.urljoin(self.base_url,value) #Get exact url 
        self.links.add(url) 
    def error(self,message): 
     pass 
    def page_links(self):  #return set of links 
     return self.links 

我得到一個異常

參數類型的「NoneType」不是可迭代

我想在我使用的urllib2請求以檢驗T方式的問題他標題內容。 我有點新本這樣一些解釋是好

+0

完整的錯誤輸出可能已經好多了。 – user6399774

+0

它是完整的輸出 – zahlen

回答

0

我已經使用BeautifulSoup代替的HTMLParser像這樣 -

soup = BeautifulSoup(pageContent) 
links = soup.find_all('a') 
+0

BeautifulSoup的作品,但我想知道我在做什麼錯了HTMLParser。 – zahlen