刮一个编码为iso-8859-1而不是utf-8的网站:如何在我的数据库中存储正确的unicode?

Ale*_* P. 1 python unicode beautifulsoup utf-8

我想用一个充满可怕问题的Python来抓一个网站,其中一个是顶部错误的编码:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为页面中出现如下所示:

Nell’ambito

代替

Nell'ambito(请注意’替换')

如果我理解正确,这是因为utf-8字节(可能是数据库编码)被解释为iso-8859-1字节(由元标记中的字符集强制).我在这个链接http://www.i18nqa.com/debug/utf8-debug.html找到了一些初步的解释

我正在使用BeautifulSoup来浏览页面,Google App Engine的urlfetch来发出请求,但是我需要的是了解在数据库中存储’通过对字符串进行编码来修复的字符串的正确方法'.

bob*_*nce 8

我使用BeautifulSoup来浏览页面,Google App Engine的urlfetch来发出请求

您是否将Content-TypeHTTP标头中的编码提供给BeautifulSoup?

如果HTML页面同时包含Content-Type标头和元标记,则标题应为"win",因此如果您只使用元标记,则可能会得到错误的编码.

否则,您可以将固定编码提供'utf-8'给Beautiful,也可以单独修复每个字符串.

恼人的说明:它实际上不是ISO-8859-1.当网页 ISO-8859-1时,浏览器实际上将其视为Windows代码页1252,类似于8859-1但不相同.这似乎表明cp1252,因为它不存在于8859-1.

u'Nell’ambito'.encode('cp1252').decode('utf-8')
Run Code Online (Sandbox Code Playgroud)

如果内容与某些UTF-8和某些cp1252在同一页面上编码不一致(通常是由于数据库内容处理不当),这将是恢复它的唯一方法,捕获UnicodeError并返回原始字符串,如果它不会转码.