3

根据@Jens Timmerman 在这篇文章中的回答:从维基百科文章中提取第一段(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')

从技术上讲,它应该可以正常运行并给我页面的来源。但这是我得到的:

在此处输入图像描述

任何帮助,将不胜感激..

4

1 回答 1

2

在检查了wgetand之后curl,我发现这不是 Python 特有的问题——它们也有“奇怪”的字符;快速检查file告诉我响应只是 gzip 压缩的,所以似乎 Wikipedia 默认只发送 gzip 压缩的数据,而不检查客户端是否真的在请求中说支持它。

幸运的是,Python 能够解压缩 gzipped 数据:将您的代码与您得到的答案集成:

import urllib2
from StringIO import StringIO
import gzip

def getPage(url):
    opener = urllib2.build_opener()
    opener.addheaders = [('User-agent', 'MyTestScript/1.0 (contact at myscript@mysite.com)'), ('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 访问 Wikipedia 内容,您可能应该避免“野蛮爬行”。

于 2013-11-03T02:44:54.797 回答