2013-11-03 6 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-запросы, такие как тот, о котором мы сейчас говорим. Разница в том, что они, как правило, более гибкие, а возвращаемые данные обычно в машиночитаемом формате, что обычно является большим плюсом для наших скриптов * и * для серверов wikipedia, которым не нужно тратить время на разметку MediaWiki. –

ответ

2

После проверки с wget и curl, я увидел, что это не является проблемой, характерной для Python - они тоже получили " странных "персонажей; быстрая проверка с file говорит мне, что ответ просто gzip-сжат, поэтому кажется, что Wikipedia просто отправляет gzipped данные по умолчанию, не проверяя, действительно ли клиент говорит, чтобы поддержать его в запросе.

К счастью, Python способен распаковке сжатым данные: интеграция коды с 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.

Смежные вопросы