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

8 投票
4 回答
9795 浏览
提问于 2025-04-15 16:27

根据这个回答:urllib2读取为Unicode

我需要获取内容类型,以便转换为Unicode。不过,有些网站没有提供“字符集”。

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

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

有没有一个默认的“编码”(当然是英语)……这样如果找不到其他的,我就可以直接用这个?

4 个回答

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"
3

我刚刚浏览了给定的链接,它会重定向到

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

然后在Firefox中按下 Ctrl + U(查看源代码),显示的内容是

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

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

@alex: 你为什么觉得它没有“字符集”呢?

看看你手上的代码(我们猜测这是导致错误的那一行,请务必提供完整的错误追踪和错误信息!):

htmlSource = unicode(htmlSource, encoding)

还有错误信息:

TypeError: 'int' object is not callable

这意味着 unicode 不是指内置函数,而是指一个 int。我记得在你之前的问题中,你有类似的内容

if unicode == 1:

我建议你给那个变量用个其他的名字,比如用_use_unicode。

更多建议:(1)总是提供足够的代码来重现错误(2)一定要阅读错误信息。

3

有没有一个默认的“编码”(当然是英文)...这样如果找不到其他的,我可以直接用这个?

没有,得自己猜。

简单的方法是:先试着用 UTF-8 解码。如果成功了,那就太好了,可能就是 UTF-8。如果不行,那就根据你浏览的页面类型,选择一个最有可能的编码。对于英文页面来说,通常用 cp1252,这是Windows系统下的西欧编码。这个编码和ISO-8859-1很像;实际上,大多数浏览器会使用 cp1252,即使你指定了 iso-8859-1,所以模仿这种行为是有必要的。

如果你需要猜测其他语言,那就复杂多了。这种情况下有一些现成的工具可以帮助你猜测。比如可以看看 chardet

撰写回答