Python 中的 urllib 调用有问题。获取服务器错误

Posted

技术标签:

【中文标题】Python 中的 urllib 调用有问题。获取服务器错误【英文标题】:Trouble with urllib calls in Python. Getting server error 【发布时间】:2014-04-03 19:57:36 【问题描述】:

我正在尝试从 Eurostat 网站下载 XML 文件,但在 Python 中使用 urllib 时遇到了问题。不知何故,当我使用我的常规 Chrome 浏览器时,它能够发出 HTTP 请求,并且网站将生成一个 XML 文件,但是当我尝试在 python 中做同样的事情时,我得到一个服务器错误。这是我正在使用的代码:

import urllib
from xml.etree import ElementTree as ET
response = urllib.urlopen("http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/lfsq_egais/Q.T.Y_GE15.EMP..NL")
result = response.read()
print result

我也尝试过使用 urllib.urlretrieve,但也没有用。为什么会发生这种情况?我得到的 html 如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Draft//EN">
<HTML>
<HEAD>
<TITLE>Error 500--Internal Server Error</TITLE>
<META NAME="GENERATOR" CONTENT="WebLogic Server">
</HEAD>
<BODY bgcolor="white">
<FONT FACE=Helvetica><BR CLEAR=all>
<TABLE border=0 cellspacing=5><TR><TD><BR CLEAR=all>
<FONT FACE="Helvetica" COLOR="black" SIZE="3"><H2>Error 500--Internal Server Error</H2>
</FONT></TD></TR>
</TABLE>
<TABLE border=0 width=100% cellpadding=10><TR><TD VALIGN=top WIDTH=100% BGCOLOR=white><FONT FACE="Courier New"><FONT FACE="Helvetica" SIZE="3"><H3>From RFC 2068 <i>Hypertext Transfer Protocol -- HTTP/1.1</i>:</H3>
</FONT><FONT FACE="Helvetica" SIZE="3"><H4>10.5.1 500 Internal Server Error</H4>
</FONT><P><FONT FACE="Courier New">The server encountered an unexpected condition which prevented it from fulfilling the request.</FONT></P>
</FONT></TD></TR>
</TABLE>

</BODY>
</HTML>

【问题讨论】:

尝试捕捉异常,类似于this answer。 代码运行正常,问题是服务器没有用我想要的 XML 文件(我在使用 Chrome 时得到)响应 urllib。相反,我得到了一个 HTML 文档,详细说明了服务器错误(“服务器遇到了阻止它完成请求的意外情况。”) @joseph - 你的代码没有问题。是服务器的问题。服务器可能期待一些参数或 cookie 并抛出 500 而不是返回更有意义的错误页面。这是一个建议。尝试检查 chrome 和服务器之间的会话,看看它发送的是你的 python 代码没有发送的内容。 @joseph - 我刚刚检查过,但是使用您刚刚粘贴的 URL 会在 xml 中发回一条错误消息,上面写着 "Error caused by the caller due to incorrect or semantically invalid arguments" @alvits 好的,现在应该修复了。 【参考方案1】:

这个问题现在已经有几个月了,但迟到总比没有好:

您正在谈论的 Eurostat REST API 应该使用 XML 内容进行响应,而 urllib 默认情况下不期望/允许。解决方案是在请求中添加一个标头Accept: application/xml

这将在 Python 2.7 中解决问题(顺便使用urllib2):

import urllib2
req = urllib2.Request("http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/"
    "lfsq_egais/Q.T.Y_GE15.EMP..NL")
req.add_header("Accept", "application/xml")
response = urllib2.urlopen(req)
print response.read()

有关更多信息和示例,请参阅urllib2 docs。

【讨论】:

以上是关于Python 中的 urllib 调用有问题。获取服务器错误的主要内容,如果未能解决你的问题,请参考以下文章

爬虫小探-Python3 urllib.request获取页面数据

Python - 从 urllib 获取图像,然后从 PIL 图像读取 EXIF 数据不起作用

python怎样抓取网页中的文字和数字数据

urllib模块

爬虫--urllib模块

python多线程爬虫爬取顶点小说内容(BeautifulSoup+urllib)