2

Pythonでurllib2を使用して一部のWebページの「content-length」ヘッダーをチェックしようとすると、ヘッダーがありません。たとえば、google.comからの応答にこのヘッダーがありません。なぜですか?

例:

r = urllib2.urlopen('http://www.google.com')
i = r.info()
print i.keys()

与える:

['x-xss-protection', 'set-cookie', 'expires', 'server', 'connection', 'cache-control', 'date', 'p3p', 'content-type', 'x-frame-options']
4

2 に答える 2

1

ここで、http応答にContent-Lengthまたはを含めることができることがわかりますTransfer-Encoding: chunked

ただし、Transfer-Encoding: chunkedヘッダーでを使用すると、ヘッダーの後に16進数の文字列が表示され、10進数に変換すると、次のチャンクの長さがわかります。そして、最後のチャンクの後0に、ファイルの終わりに到達したことを意味するこの値のを取得します。

正規表現を使用して、この16進値を取得できます(必須ではありません)

read = #string containing a line or a part of the http response
hexPat = re.compile(r'([0-9A-F]+)\r\n', re.I)
match = re.search(hexPat, read)
chunkLen = int(match.group(1), 16) #converts hexadecimal to decimal

または、最初の16進値を読み取り、最初のチャンクの長さを取得してそのチャンクを受け取り、次のチャンクの長さを取得するというように、0

于 2012-06-17T00:41:50.663 に答える
0

HEAD応答のContent-Lengthは、GET応答のContent-Length値を含む必要がありますが、常に含まれるとは限りません。

StackOverflowは次のことを行います。

> telnet stackoverflow.com 80
HEAD / HTTP/1.1
Host: stackoverflow.com


HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Content-Length: 362245                           <--------
Content-Type: text/html; charset=utf-8
Expires: Mon, 04 Oct 2010 11:51:49 GMT
Last-Modified: Mon, 04 Oct 2010 11:50:49 GMT
Vary: *
Date: Mon, 04 Oct 2010 11:50:49 GMT

Googleはしません:

> telnet www.google.com 80
HEAD / HTTP/1.1
Host: www.google.ie


HTTP/1.1 200 OK
Date: Mon, 04 Oct 2010 11:55:36 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Server: gws
X-XSS-Protection: 1; mode=block
Transfer-Encoding: chunked
于 2012-06-16T21:18:02.027 に答える