【问题标题】:Determining charset from html meta tags w/python使用 python 从 html 元标记中确定字符集
【发布时间】:2011-06-27 11:04:20
【问题描述】:

我有一个脚本需要在被 lxml.HTML() 读取以进行解析之前确定字符集。如果找不到它,我将假设 ISO-8859-1(这是正常的假设字符集吗?),并在 html 中搜索具有 charset 属性的元标记。但是我不确定最好的方法。我可以尝试使用 lxml 创建一个 etree,但我不想读取整个文件,因为我可能会遇到编码问题。但是,如果我不阅读整个文件,我将无法构建 etree,因为某些标签不会被关闭。

我是否应该只找到带有一些花哨字符串下标的元标记并在找到它或读取一定数量的行后跳出循环?也许使用低级别的 HTML 解析器,例如 html.parser?顺便说一句,使用 python3,谢谢。

【问题讨论】:

    标签: python html python-3.x html-parsing


    【解决方案1】:

    您应该首先尝试从 HTTP 标头中提取编码。如果那里不存在,则应使用 lxml 对其进行解析。这可能很棘手,因为如果字符集不匹配,lxml 会引发解析错误。一种解决方法是解码和编码忽略未知字符的数据。

    html_data=html_data.decode("UTF-8","ignore")
    html_data=html_data.encode("UTF-8","ignore")
    

    在此之后,您可以通过使用utf-8 编码调用lxml.HTML() 命令进行解析。 这样,您将能够找到 HTML 标头中定义的正确编码。

    找到编码后,您必须使用正确的编码重新解析 HTML 文档。

    不幸的是,有时您甚至在 HTML 标头中也可能找不到字符编码。我建议您仅在这些步骤失败后使用chardet 模块来查找正确的编码。

    【讨论】:

    • 谢谢,我不知道忽略选项。我已经首先从标头中读取字符集,但发现一些由于 w/e 原因而缺少 Content-Type 标头。
    • @kryptobs2000:当然。只是通知您:虽然这种方法很容易实现,但 Alohci 的链接解释了处理文档的最快算法。因此,如果您要处理大量文档,您可能更喜欢这样。
    【解决方案2】:

    正确确定 HTML 文件的字符编码实际上是一件相当复杂的事情,但是 HTML5 规范准确地定义了处理器应该如何做到这一点。你可以在这里找到算法:http://dev.w3.org/html5/spec/parsing.html#determining-the-character-encoding

    【讨论】:

    • 谢谢,希望能找到类似的东西。我想我会试试 funktku 首先提到的,因为它看起来容易多了,如果我仍然遇到麻烦,我会尝试按照规范进行。
    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 2012-09-15
    • 2019-04-11
    • 2011-10-29
    • 1970-01-01
    • 2010-09-19
    • 2017-09-06
    相关资源
    最近更新 更多