我正在嘗試構建抓取頁面上所有鏈接並將其添加到文件的網絡抓取工具。解析網頁抓取器中的HTML頁面
我的Python代碼中包含執行以下操作的方法: -
打開一個給定的網頁(urllib2的模塊被使用)
檢查該HTTP報頭內容類型包含text/html
將原始HTML響應轉換爲可讀代碼並將其存儲到html_string變量。
- 然後,它創建一個Link_Finder類,它具有屬性基url(Spider_url)和page url(page_url)的實例。 Link_Finder在另一個模塊link_finder.py中定義。
- 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方式的問題他標題內容。 我有點新本這樣一些解釋是好
完整的錯誤輸出可能已經好多了。 – user6399774
它是完整的輸出 – zahlen