2013-11-21 39 views
0

我有一個Python3的問題。Python3和http.client的問題

我想獲取http狀態代碼,例如從服務器讀取文件路徑並鍵入url的「200 OK」。

它與一些服務器但與其他那些我有以下問題:

Traceback (most recent call last): 
    File "simple_program.py", line 55, in <module> 
    main() 
    File "simple_program.py", line 52, in main 
    parser(url) 
    File "simple_program.py", line 27, in parser 
    r1 = conn.getresponse() 
    File "/usr/lib/python3.3/http/client.py", line 1143, in getresponse 
    response.begin() 
    File "/usr/lib/python3.3/http/client.py", line 354, in begin 
    version, status, reason = self._read_status() 
    File "/usr/lib/python3.3/http/client.py", line 336, in _read_status 
    raise BadStatusLine(line) 
    http.client.BadStatusLine: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 

這是一個失敗的代碼的一部分。

    conn = http.client.HTTPConnection(url) 
        conn.request("GET", path) 
        r1 = conn.getresponse() 
        conn.close() 
        print(url_path, r1.status, r1.reason) 
        print("\n") 

你能幫我嗎?

謝謝!

回答

0

看起來像服務器沒有發送HTTP狀態行......這聽起來很奇怪,但有一種方法來驗證這一點。

您可以使用curl轉儲響應標頭。例如在我的網站上:

$ curl -I http://aspyct.org 
HTTP/1.1 200 OK 
Date: Thu, 21 Nov 2013 15:42:16 GMT 
Content-Type: text/html 
Content-Length: 10645 
Last-Modified: Sat, 20 Jul 2013 14:09:39 GMT 
Connection: keep-alive 
Vary: Accept-Encoding 
Expires: Thu, 21 Nov 2013 15:42:15 GMT 
Cache-Control: no-cache 
Accept-Ranges: bytes 

這是什麼給你?如果沒有,也許服務器本身不尊重HTTP協議。

在這種情況下,你可能不會用python stdlib做很多事情。您可能想要實現您自己的請求處理程序,並在這些服務器上使用它。

+0

試着用'curl -v'代替。另外,您可以轉儲您的請求發送的標題嗎? – aspyct

+0

感謝您的回覆。 當我執行'捲曲-I'與'捲曲-v'命令一個獲得相同的... HTTP/1.1 200 OK 但我的計劃,我得到 http.client.BadStatusLine:< !DOCTYPE HTML PUBLIC「 - // IETF // DTD HTML 2.0 // EN」> 如果我在python2中創建代碼,我沒有問題... – user3018205

+0

這導致我的評論的其他部分:你能指出你的請求標頭?或者,甚至可以提供具有此行爲的服務器的地址? – aspyct