Skip to main content

从响应头和内容推断 HTML 编码

项目描述

猜测

建造 执照 派皮 地位 Python

从响应标头和内容推断 HTML 编码。超越了大多数 HTTP 客户端库所做的编码检测。

基本用法

导出的主要功能guessencinfer_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()按此顺序查找少数几个地方以提取编码,并在找到一个时停止:

  1. charset来自Content-TypeHTTP 实体标头的值中。
  2. charset来自<meta charset="xxxx">HTML 标记的值中。
  3. 在带有 的标签的charset值中。<meta>http-equiv="Content-Type"
  4. 使用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

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

guessenc-0.3.tar.gz (330.3 kB 查看哈希)

已上传 source

内置分布

guessenc-0.3-py3-none-any.whl (5.6 kB 查看哈希)

已上传 py3