4

http://book.libertorrent.com/からデータをフェッチしようとしていますが、応答にいくつかの追加データ (ヘッダー) が存在するため、現時点ではひどく失敗しています。私のコードは非常に単純です:

response = urllib.urlopen('http://book.libertorrent.com/login.php')
f = open('someFile.html', 'w')
f.write(response.read())

read()は以下を返します:

Date: Fri, 09 Nov 2012 07:36:54 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Cache-Control: no-cache, pre-check=0, post-check=0
Expires: 0
Pragma: no-cache
Set-Cookie: bb_test=973132321; path=/; domain=book.libertorrent.com
Content-Language: ru

1ec0
...Html...
0

そしてresponse.info()は空です。

応答を修正する方法はありますか?

4

1 に答える 1

1

これを試してみましょう:

$ echo -ne "GET /index.php HTTP/1.1\r\nHost: book.libertorrent.com\r\n\r\n" | nc book.libertorrent.com 80 | head -n 10
HTTP/1.1 200 OK
WWW
Date: Sat, 10 Nov 2012 17:41:57 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Content-Language: ru

1f57
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html dir="ltr">

2行目の「WWW」が見えますか?これは有効な HTTP ヘッダーではありません。これが、ここで応答パーサーをスローしているものだと思います。

ちなみに、ここでは python2 と python3 の動作が異なります。

  • python2 は、この無効なヘッダーの後の内容をすぐに解釈するようです。
  • python3 はすべてのヘッダーを無視し、二重改行の後のコンテンツを読み続けます。ヘッダーが無視されるため、転送エンコーディングも無視されるため、コンテンツの長さは本文の一部として解釈されます。

したがって、最終的に問題は、サーバーが無効な応答を送信していることです。これは、サーバー側で修正する必要があります。

于 2012-11-10T17:55:23.407 に答える