我用beauthoulsoup来解析一些网页。在
偶尔我会遇到如下“unicode地狱”错误:
看看这篇文章的来源大西洋网[http://www.theatlantic.com/education/archive/2013/10/why-are-hundreds-of-harvard-students-studying-ancient-chinese-philosophy/280356/]
在og:description元属性中可以看到:
<meta property="og:description" content="The professor who teaches Classical Chinese Ethical and Political Theory claims, "This course will change your life."" />
当beauthulsoup解析它时,我看到:
^{pr2}$如果我尝试将其编码为UTF-8,那么注释建议:https://stackoverflow.com/a/10996267/442650
>>> print repr(description.encode('utf8'))
'The professor who teaches\xc2\xa0Classical Chinese Ethical and Political Theory claims, "This course will change your life."'
就在我以为我的unicode问题已经得到控制的时候,我还是不太明白到底发生了什么,所以我将提出几个问题:
1-为什么BeautifulSoup会将
转换为\xa0
[一个拉丁字符集空格字符]?这个页面上的字符集和标题都是UTF-8,我想beauthulsoup会把数据拉出来进行编码吗?为什么不换成<space>
?在
2-有没有一种通用的方法来规范化转换的空白?在
3-当我编码为UTF8时,\xa0
在哪里变成了{
我可以通过unicodedata.normalize('NFKD',string)
来帮助我找到我想要的地方——但是我很想知道是什么地方出了问题,并在将来避免类似的问题。在
你没有遇到问题。一切都按计划进行。在
表示non-breaking space character。它不会被替换为空格,因为它不代表一个空格;它代表一个不间断的空格。将其替换为空格将丢失信息:在该空间出现的位置,文本呈现引擎不应放置换行符。在非中断空格的Unicode代码点是U+00A0,它在Python中用Unicode字符串写成
\xa0
。在U+00A0的UTF-8编码是十六进制的两字节序列c2a0,或者用Python字符串表示形式
\xc2\xa0
。在UTF-8中,7位ASCII集之外的任何内容都需要两个或更多字节来表示它。在这种情况下,第八位是最高的。这意味着它可以用两字节序列(二进制)表示110xxxxx 10xxxxxx
,其中x是码位的二进制表示。在A0的情况下,即10000000
,或者当编码为UTF-8、11000010 10000000
或c2a0时。在许多人在HTML中使用} rules 中的一个),但这并不是它们真正的用途;它们应该用于诸如名字之类的东西,比如“宫城先生”,你不希望“先生”和“宫城先生”之间出现断线。我不知道为什么在这个特殊的情况下使用它;它在这里似乎不合适,但这更多的是源代码的问题,而不是解释它的代码。在
来获得不被通常的HTML空白折叠规则折叠的空间(在HTML中,所有连续的空格、制表符和换行符都被解释为一个空格,除非应用了CSS ^{现在,如果您不真正关心布局,所以您不介意文本布局算法是否选择将其作为包装的位置,但希望仅将其解释为常规空间,则使用NFKD规范化是一个非常合理的答案(或者NFKC,如果您更喜欢预合成重音符号而不是分解重音符号)。NFKC and NFKD normalizations映射字符,这样在大多数上下文中表示基本相同语义值的大多数字符都被展开。例如,连字被展开(ffi->;ffi),古代的长s字符被转换成s(ſ->;s),罗马数字字符被扩展成单独的字母(Ⅳ->;IV),不间断的空格转换成普通空格。对于某些字符,NFKC或NFKD规范化可能会丢失在某些上下文中很重要的信息:ℌ和ℍ都将规范化为H,但在数学文本中可以用来表示不同的东西。在
相关问题 更多 >
编程相关推荐