Beautiful Soup 3:将双字节Unicode序列转换为实际的Unicode字符

时间:2014-11-18 11:44:44

标签: python unicode encoding utf-8 beautifulsoup

我正在使用Beautiful Soup 3和Python 2.7来抓取包含非ASCII字符(变音符号)的utf-8编码网页。我得到了我想要的文本,但所有Unicode字符都返回为双字节字符序列而不是实际的Unicode字符。 (该字符串是通过使用soup.find()获得的,并将NavigableString结果转换为带有str()的字符串。)

例如:我得到Fahrvergnügen而不是Fahrvergn ü gen。

我几乎尝试了所有编码('utf-8'),decode('utf-8')和unicode()的排列,但没有任何东西返回变音符号而不是奇怪的双字节序列。

我很确定有一个简单的解决方案,我只是无法弄清楚用什么命令将BS NavigableString或包含Fahrvergnügen的普通旧字符串转换为Fahrvergnügen或确保奇怪的双字节序列不是首先回来了。

BTW,¼是C3BC,然而,小写的变音符号是00FC。

1 个答案:

答案 0 :(得分:4)

您正在查看的字符看起来像双重编码的UTF-8。如果输入被输入,那么BeautifulSoup确实没有任何东西可以纠正它。

BeautifulSoup总是基本上返回Unicode,这应该是正确的(除非你实际上是在操纵编码,在这种情况下,这是一个绝望的麻烦)。

尽管不太可能,但BeautifulSoup可能是双重编码的来源。如果您确定它是正确的UTF-8,您可以覆盖已删除页面的字符集;在创建BeautifulSoup对象时使用BeautifulSoup(..., fromEncoding='utf-8')

UTF-8中的“Fahrvergnügen”由字节46 61 68 72 76 65 72 67 6e c3 bc 67 65 6e(十六进制)表示,其中 c3 bc 是{的UTF-8编码{3}}

当这个字符串被错误地转换时,好像它是传统的8位编码,如ISO-8859-1(其中0xc3是Ã和0xbc是¼),结果是46 61 68 72 76 65 72 67 6e c3 83 c2 bc 67 65 6e,这大概是你在看的。

如果您确切地知道错误的性质,则可以恢复此双重编码,但这不是(直接)自动化 - 您需要检查每个编码错误并找出(或猜测)哪些字符是正确的假设代表。