繁体   English   中英

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

[英]What is the default content-type/charset?

根据这个答案: urllib2读取到Unicode

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

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

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

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

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

不,没有。 你必须猜。

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

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

好吧,我只是浏览了重定向到的给定URL

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)总是读取错误信息。

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

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

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

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

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

幸运的是,Mark Pilgrim以chardet模块的形式完成了将firefox实现移植到python的所有艰苦工作。 介绍了如何在Dive Into Python 3的章节中使用它也值得一读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM