什么是默认内容类型/字符集?

时间:2009-11-27 12:44:52

标签: python html unicode encoding

根据这个答案:urllib2 read to Unicode

我必须获取内容类型才能更改为unicode。 但是,有些网站没有“charset”。

例如,this页面的['content-type']是“text / html”。我无法将其转换为unicode。

encoding=urlResponse.headers['content-type'].split('charset=')[-1]
htmlSource = unicode(htmlSource, encoding)
TypeError: 'int' object is not callable

是否有默认的“编码”(当然是英文)......所以如果找不到任何内容,我可以使用它吗?

5 个答案:

答案 0 :(得分:3)

  

是否有默认的“编码”(当然是英文)......所以如果找不到任何内容,我可以使用它吗?

不,没有。你必须猜测。

琐碎的方法:尝试解码为UTF-8。如果它工作,很好,它可能是UTF-8。如果没有,请为您正在浏览的页面选择最可能的编码。对于cp1252的英文页面,Windows西欧编码。 (这与ISO-8859-1类似;实际上大多数浏览器将使用cp1252而不是iso-8859-1,即使您指定了charset,因此值得复制该行为。)

如果您需要猜测其他语言,它会变得非常毛茸茸。现有模块可以帮助您猜测这些情况。见例如。 chardet

答案 1 :(得分:3)

我刚刚浏览了指定的网址,该网址重定向到

http://www.engadget.com/2009/11/23/apple-hits-back-at-verizon-in-new-iphone-ads-video

然后在FireFox中点击Crtl-U(查看源代码)并显示

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

@Konrad:你是什么意思“似乎......使用ISO-8859-1”??

@alex:是什么让你觉得它没有“charset”??

查看您拥有的代码(我们GUESS是导致错误的行(请始终显示FULL traceback和错误消息!)):

htmlSource = unicode(htmlSource, encoding)

和错误消息:

TypeError: 'int' object is not callable

这意味着unicode不引用内置函数,它引用int。我记得在你的另一个问题中你有类似的东西

if unicode == 1:

我建议您为该变量使用其他名称 - 比如use_unicode。

更多建议:(1)总是显示足够的代码来重现错误(2)总是读取错误信息。

答案 2 :(得分:2)

理论上,默认字符集为ISO-8859-1。但通常,这不能依赖。不发送明确字符集的网站值得受到谴责。小心发送愤怒的电子邮件给Endgadget的网站管理员?

答案 3 :(得分:0)

htmlSource=htmlSource.decode("utf8")应该适用于大多数情况,除非您正在抓取非英语编码网站。

或者您可以像这样编写强制解码功能

def forcedecode(text):
    for x in ["utf8","sjis","cp1252","utf16"]:
        try:return text.decode(x)
        except:pass
    return "Unknown Encoding"

答案 4 :(得分:0)

如果没有明确的内容类型,它应该是ISO-8859-1,如前面答案中所述。不幸的是,并非总是如此,这就是为什么浏览器开发人员花了一些时间来获取算法,试图根据页面内容猜测内容类型。

幸运的是,Mark Pilgrim以chardet module的形式完成了将firefox实现移植到python的所有艰苦工作。他潜入Python 3的其中一章的introduction on how it works也值得一读。