使用Python Requests获取HTTP头部信息

23
我正在尝试解析使用Python Requests库执行的HEAD请求的结果,但似乎无法访问响应内容。
根据文档,我应该能够从requests.Response.text访问内容。这对于GET请求在我这里可以正常工作,但是对于HEAD请求返回None。 GET请求(有效)
import requests
response = requests.get(url)
content = response.text

内容 = <html>...</html>

HEAD请求(无内容)

import requests
response = requests.head(url)
content = response.text

内容 =


编辑

好的,我很快意识到从答案中得知 HEAD 请求不应该返回内容- 只有头部。但这是否意味着,要访问页面中在 <head> 标记中找到的东西,比如 <link><meta> 标签,必须获取整个文档?

3个回答

34

定义规定,HEAD请求的响应不包含消息体。

如果您想要获取响应主体,请发送GET请求。如果您只对响应状态码和标头感兴趣,则发送HEAD请求。Iff是if and only if的缩写,表示只有当满足某些条件时才执行操作。

HTTP可以传输任意内容;HTTP术语中的“标头”与HTML的<head>元素完全无关。然而,HTTP可以建议仅下载文档的一部分。如果您知道HTML <head>代码的长度(或上限),则可以在请求中包括一个HTTP Range标头,以建议远程服务器仅返回特定数量的字节。如果远程服务器支持HTTP范围,则会返回减少的响应。


好的,我的错 - 那么如何从 HEAD 请求中捕获像 <link>meta 标签这样的东西?还是不可能的? - Yarin
1
嗯,<link><meta>标签只存在于HTML body中。您可以访问的唯一标题是HTTP头。你为什么要发送HEAD而不是GET呢? - phihag
phihag-?<meta>标签位于文档的<head>部分-在此页面上查看源代码。我希望只获取<head>以减少链接抓取的时间。 - Yarin
4
在不同协议的背景下混淆了类似的术语。HTTP 并不知道 HTML 代码的任何内容,它只是传输带有标头(例如内容类型或过期日期)的任意内容。如果您知道 HTML <head> 的长度,则可以在请求中包含 Range 标头,但我怀疑除非完整的 HTML 代码真的很大,否则这将加速事情的进展。 - phihag

10

HEAD请求没有任何内容!尝试使用response.headers - 那可能是关键所在。HTTP HEAD请求不会获取你从GET请求中得到的HTML响应的<head>元素。我认为这就是你的错误所在。


3

HEAD响应没有正文内容。它们只返回HTTP头信息,与使用GET请求获取的相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接