BeautifulSoup 在从 utf-8 解码到 unicode 时遗漏了一些字母

Posted

技术标签:

【中文标题】BeautifulSoup 在从 utf-8 解码到 unicode 时遗漏了一些字母【英文标题】:BeautifulSoup miss some alphabets in decoding from utf-8 to unicode 【发布时间】:2016-12-26 06:46:03 【问题描述】:

我正在尝试从站点页面解析 cyrillyc 文本,如果我尝试打印包含单词“word”中的右引号的 scring 的 soup.text,则会出现该错误

错误 'charmap' 编解码器无法对位置 6 中的字符 u'\xab' 进行编码:字符映射到未定义

原始字符串页面(utf-8)

urllib2.urlopen raw page = bbb = '\xab\x80\xd1\x8c\xc2\xbb' 

\xbb 和 \xab- 是右引号

我尝试手动转换为 unicode(BeautifulSoup 也这样做) unicode(bbb, 'utf8', errors='ignore')

但尽管有错误键“忽略”未知元素,但它们仍然存在 int

我明白了

\xab\u0446\u0435\u0437\u0430\u0440\u044c**\xbb**'

我尝试使用帮助常规 exp 删除以 ^\x 开头的所有未知元素,但它不起作用

bbb = re.sub(r'[\x00-\x7f]', r' ', bbb)

【问题讨论】:

问题不在于 bs4,它是您系统上的编码问题。 【参考方案1】:

但尽管有错误键“忽略”未知元素,它们仍然存在

u'\xbb' 不是未知元素,那里没有问题。它代表字符 U+00BB 右指双角引号。 Unicode 字符串文字 u'\xbb'u'\u00bb' 表示相同的字符串。

\x 具有不同的含义,具体取决于它使用的字符串文字类型。在字节字符串中,它引入了一个从 0x00 到 0xFF 的十六进制编码字节。在 Unicode 字符串中,它引入了一个从 U+0000 到 U+00FF 的十六进制编码字符。在生成字符串的 repr() 表示形式时,Python 更喜欢使用 \x 转义而不是可以说更清晰的 \u 转义输出 U+00FF 范围内的字符,因为它们更短。

\u\x 只是在字符串文字表示中引用字符的替代方式;它们实际上不是字符串值的一部分。值中没有实际的反斜杠,因此您不能使用 re 尝试删除可能出现在 repr() 表单中的字符作为反斜杠转义。

实际错误:

error 'charmap' codec can't encode character u'\xab' in position 6: charater maps to undefined

还是像往常一样只是PrintFails。显然您的控制台使用的编码不包含字符 U+00AB。

如果您使用的是 Windows 命令提示符,您可以尝试使用 win-unicode-console 作为该特定控制台损坏的解决方法。

【讨论】:

以上是关于BeautifulSoup 在从 utf-8 解码到 unicode 时遗漏了一些字母的主要内容,如果未能解决你的问题,请参考以下文章

JSONKit在从iphone中的Web服务解码JSON对象时更改浮点值

python的编码和解码

如何使用 BeautifulSoup 将 UTF-8 编码的 HTML 正确解析为 Unicode 字符串? [复制]

使用 BeautifulSoup 获取属性值

Beautifulsoup 无法找到名称中带有连字符的类

使用 Javascript 解码 UTF-8