2011-02-15 17 views
1

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

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

回答

3

您应该首先尝试从HTTP标头中提取编码。如果它不存在,你应该用lxml解析它。这可能会很棘手,因为如果charset不匹配,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模块来找到正确的编码。

+0

谢谢,我不知道有关忽略选项。我已经首先从头文件中读取字符集,但发现一些缺少Content-Type头的W/E原因。 – kryptobs2000 2011-02-15 12:00:33

+0

@ kryptobs2000:好的。只是告诉你:虽然这种方法很容易实现,但Alohci的链接解释了处理文档的最快算法。所以如果你正在处理大量的文件,你可能更喜欢这样。 – 2011-02-15 18:02:23