使用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
谢谢!
答案 0 :(得分:8)
如果'内容类型'足够了,你可以发一个HTTP' Head'请求而不是' Get',只接收HTTP标头。
import requests
url = 'http://www.december.com/html/demo/hello.html'
response = requests.head(url)
print response.headers['content-type']
答案 1 :(得分:4)
注意:在询问此问题时,正确获取标题流的正确方法是使用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)
假设你使用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)
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)