我有我想從我的python腳本調用的這個簡單URL: http://test.my-site.com/bla-blah/createAccount (由於隱私,我更改了一些字母,所有特殊字符等完全一樣)Python urllib2.urlopen:即使存在HTTP標頭錯誤,也請閱讀站點主體
import urllib2
def myfunc(self, url):
result = urllib2.urlopen(url).read()
# HTTP Error 400: Bad Request
當我調用上面的網址,我得到的錯誤:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 406, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 519, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 444, in error
return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 527, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 400: Bad Request
我不認爲它是與報價(和/或空格明顯) 。 當我改用URL http://test.my-site.com/bla-blah/listAccounts時,它可以正常工作,結果與我在瀏覽器中調用URL時得到的文本完全相同。當然,我通過瀏覽器檢查了第一個URL,它工作正常。
不知道這可能是什麼?
編輯澄清:
這兩個網址應可贖回沒有任何進一步的參數或查詢字符串,權當他們站在那裏以上。該網站應顯示「錯誤:參數丟失」。當我在瀏覽器中調用URL或通過在bash中捲曲時,會發生這種情況。只是python模塊出問題了。
EDIT2(也改爲發佈標題以更好地匹配情況)
謝謝你,你是對的:如果我做curl -v 'http://test.my-site.com/bla-blah/createAccount'
,我得到如下:
* About to connect() to <blackened> port 80 (#0)
* Trying 193.46.215.110... connected
> GET <blackened> HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: <blackened>
> Accept: */*
>
< HTTP/1.1 400 Bad Request
< content-language: en-US
< server: <blackened>
< date: Thu, 04 Dec 2014 07:20:15 GMT
< set-cookie: beng_proxy_session=e2e037e7e79c1b03; HttpOnly; Path=/; Version=1; Discard
< p3p: CP="CAO PSA OUR"
< content-length: 234
<
error: parameter x missing
error: parameter y missing
* Connection #0 to host <blackened> left intact
* Closing connection #0
由於你可以看到,有一個HTTP頭錯誤。但curl(和瀏覽器)繼續打印site-body(「parameter missing ...」),但是python urllib在看到標題錯誤後停止並且不打印正文。 (這個頭文件錯誤是由服務器應用程序發送的,我想這與python urllib無關) 所以我們離得更近了一步,但即使出現錯誤,我仍然需要看到body ,因爲我必須知道(並顯示)究竟發生了什麼錯誤。 但是剛纔我能夠找到一個解決方案到:
try:
response = urllib2.urlopen("http://test.my-site.com/bla-blah/createAccount")
contents = response.read()
print("success: %s" % contents)
except urllib2.HTTPError as e:
contents = e.read()
print("error: %s" % contents)
這樣,我得到了網站的主體,不管錯誤或成功。
(順便說一句,這是我從得到了解決後:Overriding urllib2.HTTPError or urllib.error.HTTPError and reading response HTML anyway)
非常感謝您!
你打電話給你的'myfunc()'? – 2014-12-03 11:58:57
這並不重要,當我直接在Python中調用這些東西時會發生同樣的情況 – Droids 2014-12-03 12:04:56