靓汤和Unicode问题

2024-09-24 02:24:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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&nbsp;Classical Chinese Ethical and Political Theory claims, &quot;This course will change your life.&quot;" />

当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会将&nbsp;转换为\xa0[一个拉丁字符集空格字符]?这个页面上的字符集和标题都是UTF-8,我想beauthulsoup会把数据拉出来进行编码吗?为什么不换成<space>?在

2-有没有一种通用的方法来规范化转换的空白?在

3-当我编码为UTF8时,\xa0在哪里变成了{}的序列?在

我可以通过unicodedata.normalize('NFKD',string)来帮助我找到我想要的地方——但是我很想知道是什么地方出了问题,并在将来避免类似的问题。在


Tags: andthecom编码unicodedescriptionogpolitical
1条回答
网友
1楼 · 发布于 2024-09-24 02:24:13

你没有遇到问题。一切都按计划进行。在

&nbsp;表示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中使用&nbsp;来获得不被通常的HTML空白折叠规则折叠的空间(在HTML中,所有连续的空格、制表符和换行符都被解释为一个空格,除非应用了CSS ^{} rules中的一个),但这并不是它们真正的用途;它们应该用于诸如名字之类的东西,比如“宫城先生”,你不希望“先生”和“宫城先生”之间出现断线。我不知道为什么在这个特殊的情况下使用它;它在这里似乎不合适,但这更多的是源代码的问题,而不是解释它的代码。在

现在,如果您不真正关心布局,所以您不介意文本布局算法是否选择将其作为包装的位置,但希望仅将其解释为常规空间,则使用NFKD规范化是一个非常合理的答案(或者NFKC,如果您更喜欢预合成重音符号而不是分解重音符号)。NFKC and NFKD normalizations映射字符,这样在大多数上下文中表示基本相同语义值的大多数字符都被展开。例如,连字被展开(ffi->;ffi),古代的长s字符被转换成s(ſ->;s),罗马数字字符被扩展成单独的字母(Ⅳ->;IV),不间断的空格转换成普通空格。对于某些字符,NFKC或NFKD规范化可能会丢失在某些上下文中很重要的信息:ℌ和ℍ都将规范化为H,但在数学文本中可以用来表示不同的东西。在

相关问题 更多 >