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对象时更改浮点值