2013-11-03 45 views
2

據對這個職位的答案被@Jens蒂默曼:Extract the first paragraph from a Wikipedia article (Python)錯誤爬行維基

我這樣做:

import urllib2 
def getPage(url): 
    opener = urllib2.build_opener() 
    opener.addheaders = [('User-agent', 'Mozilla/5.0')] #wikipedia needs this 

    resource = opener.open("http://en.wikipedia.org/wiki/" + url) 
    data = resource.read() 
    resource.close() 
    return data 

print getPage('Steve_Jobs') 

技術上應該正常運行,並給我的頁面的源代碼。但這裏是我得到:

enter image description here

任何幫助,將不勝感激..

+3

爲什麼抓取維基百科,如果你可以使用自己的[API](http://www.mediawiki.org/wiki/API)? – NullUserException

+0

@NullUserException,我很抱歉,但我討厭像你這樣的評論。 OP想用'python'來完成,我們能不能僅僅關注幫助他實現,而不是建議其他方法? –

+3

@ l19:NullUserException是完全正確的;維基百科API可以用於Python(實際上,這是最常見的情況之一),因爲它們只是簡單的HTTP請求,就像我們現在正在討論的那樣。所不同的是,他們通常更靈活,返回的數據通常是在機器可讀的格式,這是典型的爲我們的腳本大加*和*維基百科服務器,不必浪費時間渲染鏈接到MediaWiki標記。 –

回答

2

wgetcurl檢查後,我看到了,這是不是Python的具體問題 - 他們也得到了「奇怪「的角色;快速檢查與file告訴我,該反應僅僅是用gzip壓縮的,所以它似乎只是維基百科默認發送gzip壓縮的數據,而不檢查如果客戶確實指出要支持它的要求。

幸運的是,Python是能夠解gzip壓縮的數據:與this answer整合你的代碼中得到:

import urllib2 
from StringIO import StringIO 
import gzip 

def getPage(url): 
    opener = urllib2.build_opener() 
    opener.addheaders = [('User-agent', 'MyTestScript/1.0 (contact at [email protected])'), ('Accept-encoding', 'gzip')] 
    resource = opener.open("http://en.wikipedia.org/wiki/" + url) 
    if resource.info().get('Content-Encoding') == 'gzip': 
     buf = StringIO(resource.read()) 
     f = gzip.GzipFile(fileobj=buf) 
     return f.read() 
    else: 
     return resource.read() 

print getPage('Steve_Jobs') 

其作品在我的機器上就好了。

儘管如此,正如已指出了意見,你應該避免「粗暴爬行」,如果你想訪問維基百科的內容以編程方式使用其API。