使用python从html元标记确定字符集

使用python从html元标记确定字符集,python,html,python-3.x,html-parsing,Python,Html,Python 3.x,Html Parsing,我有一个脚本,需要在lxml.HTML()读取进行解析之前确定字符集。如果找不到,我将假设ISO-8859-1(这是正常假设的字符集,对吗?),并在html中搜索带有字符集属性的meta标记。但是我不确定最好的方法。我可以尝试用lxml创建一个etree,但我不想读取整个文件,因为我可能会遇到编码问题。但是,如果我不读取整个文件,我就无法构建etree,因为某些标记不会被关闭 我是否应该找到一个带有特殊字符串订阅的meta标记,并在找到它或读取了一定数量的行后中断循环?可能使用低级HTML解析器

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


我是否应该找到一个带有特殊字符串订阅的meta标记,并在找到它或读取了一定数量的行后中断循环?可能使用低级HTML解析器,例如HTML.parser?使用python3 btw,谢谢。

您应该首先尝试从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标题中也可能找不到字符编码。我建议您只有在这些步骤失败后才使用该模块查找正确的编码。

您应该首先尝试从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标题中也可能找不到字符编码。我建议您只有在这些步骤失败后才使用该模块找到正确的编码。

正确确定HTML文件的字符编码实际上是一件相当复杂的事情,但HTML5规范精确定义了处理器应该如何做。您可以在这里找到算法:

正确确定HTML文件的字符编码实际上是一件相当复杂的事情,但是HTML5规范精确地定义了处理器应该如何做。您可以在这里找到算法:

谢谢,我不知道忽略选项。我已经第一次从标题中读取了字符集,但是由于w/e原因,我发现了一些缺少内容类型标题的字符集。@kryptobs2000:当然。只是想告诉你:虽然这种方法很容易实现,但Alohci的链接解释了处理文档的最快算法。因此,如果您正在处理大量文档,您可能更喜欢这样。谢谢,我不知道忽略选项。我已经第一次从标题中读取了字符集,但是由于w/e原因,我发现了一些缺少内容类型标题的字符集。@kryptobs2000:当然。只是想告诉你:虽然这种方法很容易实现,但Alohci的链接解释了处理文档的最快算法。因此,如果您正在处理大量文档,您可能更喜欢这样。谢谢,我希望找到与此完全相同的内容。我想我会尝试funktku首先提到的方法,因为它看起来容易多了,如果我仍然遇到麻烦,我会尝试按照规范来做。谢谢,我希望找到像这样的方法。我想我会尝试funktku首先提到的方法,因为它看起来容易多了,如果我仍然遇到麻烦,我会尝试按照规范来做。