2014-04-03 29 views
0

我想从Eurostat网站下载一个XML文件,但我在使用Python中的urllib时遇到了问题。不知何故,当我使用我的常规Chrome浏览器时,它能够发出HTTP请求,网站将生成一个XML文件,但是当我尝试在python中执行相同的操作时,出现服务器错误。这是我使用的代码:我一直在使用urllib.urlretrieve也试图Python中urllib调用的问题。获取服务器错误

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 

而且也不能工作。任何可能发生这种情况的原因?我回来的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> 
+0

尝试捕获异常,类似于[此答案](http://stackoverflow.com/a/3351970/1987598)。 –

+0

代码运行良好,问题是服务器没有响应urllib与我想要的XML文件(我使用Chrome时得到的)。相反,我得到一个详细描述服务器错误的HTML文档(“服务器遇到了一个意外情况,导致它无法完成请求。”) – joseph

+0

@joseph - 这不是您的代码问题。这是服务器的问题。服务器可能会期望一些参数或cookie并抛出500而不是返回更有意义的错误页面。这是一个建议。尝试检查铬和服务器之间的会话,看看它发送的是你的Python代码没有发送的内容。 – alvits

回答

1

这个问题是一个几个月大了,但迟到总比不到好:

和你谈话的欧盟统计局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