从响应头和内容推断 HTML 编码
项目描述
猜测
从响应标头和内容推断 HTML 编码。超越了大多数 HTTP 客户端库所做的编码检测。
基本用法
导出的主要功能guessenc是infer_encoding().
>>> import requests
>>> from guessenc import infer_encoding
>>> resp = requests.get("http://www.fatehwatan.ps/page-183525.html")
>>> resp.raise_for_status()
>>> infer_encoding(resp.content, resp.headers)
(<Source.META_HTTP_EQUIV: 2>, 'cp1256')
这告诉我们检测到的编码是 cp1256,并且它是从带有http-equiv='Content-Type'.
签名详情infer_encoding():
def infer_encoding(
content: Optional[bytes] = None,
headers: Optional[Mapping[str, str]] = None
) -> Pair:
...
代表页面 HTML ,content例如response.content.
表示 HTTP 响应标headers头,例如response.headers. 如果提供,这应该是支持不区分大小写的查找的数据结构,例如requests.structures.CaseInsensitiveDict
or multidict.CIMultiDict。
这两个参数都是可选的。
返回类型是 a tuple。
元组的第一个元素是Source枚举的成员(请参阅下面的搜索过程)。源指示检测到的编码来自何处。
元组的第二个元素是 a str,它是检测到的编码的规范名称,或者None如果没有找到编码。
其他图书馆的不足之处在哪里?
库requests“[follows] RFC 2616 to the letter”使用 HTTP 标头来确定响应内容的编码。这意味着,除其他外,ISO-8859-1如果没有给出字符集,则使用作为后备,尽管 UTF-8在网页上使用的所有其他编码绝对相形见绌。
# requests/adapters.py
response.encoding = get_encoding_from_headers(response.headers)
如果requests根本找不到 HTTPContent-Type标头,它将退回到通过检测chardet而不是在 HTML 标记中查找有意义的信息。这一点都没有错。这只是意味着requests维护人员选择专注于requests 作为 HTTP 库而不是 HTML 库的强大功能。如果您想对编码检测进行更细粒度的控制,请尝试infer_encoding().
这也不是要挑出来requests的。还有其他库在编码检测方面做同样的事情;
aiohttp检查Content-Type标头,否则默认为 UTF-8 而无需查看其他任何地方。
搜索过程
该函数guessenc.infer_encoding()按此顺序查找少数几个地方以提取编码,并在找到一个时停止:
- 在
charset来自Content-TypeHTTP 实体标头的值中。 - 在
charset来自<meta charset="xxxx">HTML 标记的值中。 - 在带有 的标签的
charset值中。<meta>http-equiv="Content-Type" - 使用
chardet图书馆。
上述每个“来源”都由Source枚举的相应成员表示:
class Source(enum.Enum):
"""Indicates where our detected encoding came from."""
CHARSET_HEADER = 0
META_CHARSET = 1
META_HTTP_EQUIV = 2
CHARDET = 3
COULD_NOT_DETECT = 4
如果上面列表中的 4 个源都没有返回可行的编码,则用 表示Source.COULD_NOT_DETECT。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。