python-requests:获取响应内容的头部而不消耗所有内容

use*_*785 4 python unicode http python-requests

使用python-requests和python-magic,我想测试web资源的mime类型而不获取其所有内容(特别是如果此资源恰好是例如ogg文件或PDF文件).根据结果​​,我可能决定全部取出它.但是,在测试mime-type之后调用text方法只返回尚未消耗的内容.如何在不消耗响应内容的情况下测试mime类型?

以下是我目前的代码.

import requests
import magic


r = requests.get("http://www.december.com/html/demo/hello.html", prefetch=False)
mime = magic.from_buffer(r.iter_content(256).next(), mime=True)

if mime == "text/html":
    print(r.text)  # I'd like r.text to give me the entire response content
Run Code Online (Sandbox Code Playgroud)

谢谢!

Cor*_*erg 8

如果'content-type'足够,您可以发出HTTP'Head'请求而不是'Get',只接收HTTP标头.

import requests

url = 'http://www.december.com/html/demo/hello.html'
response = requests.head(url)
print response.headers['content-type']
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 5

注意:在提出这个问题时,仅获取正文的标头流的正确方法是使用prefetch=False。该选项已被重命名为,stream并且布尔值已反转,因此您需要stream=True.

原来的答案如下。


一旦使用iter_content(),就必须继续使用;.text在底层间接使用相同的接口(通过.content)。

换句话说,通过使用iter_content(),您必须.text手动完成工作:

from requests.compat import chardet

r = requests.get("http://www.december.com/html/demo/hello.html", prefetch=False)
peek = r.iter_content(256).next()
mime = magic.from_buffer(peek, mime=True)

if mime == "text/html":
    contents = peek + b''.join(r.iter_content(10 * 1024))
    encoding = r.encoding
    if encoding is None:
        # detect encoding
        encoding = chardet.detect(contents)['encoding']
    try:
        textcontent = str(contents, encoding, errors='replace')
    except (LookupError, TypeError):
        textcontent = str(contents, errors='replace')
    print(textcontent)
Run Code Online (Sandbox Code Playgroud)

假设您使用 Python 3。

另一种方法是提出 2 个请求:

r = requests.get("http://www.december.com/html/demo/hello.html", prefetch=False)
mime = magic.from_buffer(r.iter_content(256).next(), mime=True)

if mime == "text/html":
     print(r.requests.get("http://www.december.com/html/demo/hello.html").text)
Run Code Online (Sandbox Code Playgroud)

Python 2 版本:

r = requests.get("http://www.december.com/html/demo/hello.html", prefetch=False)
peek = r.iter_content(256).next()
mime = magic.from_buffer(peek, mime=True)

if mime == "text/html":
    contents = peek + ''.join(r.iter_content(10 * 1024))
    encoding = r.encoding
    if encoding is None:
        # detect encoding
        encoding = chardet.detect(contents)['encoding']
    try:
        textcontent = unicode(contents, encoding, errors='replace')
    except (LookupError, TypeError):
        textcontent = unicode(contents, errors='replace')
    print(textcontent)
Run Code Online (Sandbox Code Playgroud)