- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 BeautifulSoup 来解析一些网页。
偶尔我会遇到如下“unicode hell”错误:
查看 TheAtlantic.com 上这篇文章的来源 [ 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."" />
当 BeautifulSoup 解析它时,我看到了这个:
>>> print repr(description)
u'The professor who teaches\xa0Classical Chinese Ethical and Political Theory claims, "This course will change your life."'
如果我尝试将它编码为 UTF-8,就像这样 SO 评论建议: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
[拉丁字符集空格字符]?此页面上的字符集和 header 是 UTF-8,我认为 BeautifulSoup 会提取该数据进行编码?为什么不将其替换为 <space>
?
2- 是否有一种通用的方法来标准化转换中的空格?
3- 当我编码为 UTF8 时,\xa0
在哪里?成为 \xc2\xa0
的序列?
我可以通过 unicodedata.normalize('NFKD',string)
传递所有内容帮助我到达我想去的地方——但我很想了解哪里出了问题,并避免将来出现此类问题。
最佳答案
您没有遇到问题。一切都按预期运行。
表示non-breaking space character .这不会被空格替换,因为它不代表空格;它代表一个不间断的空间。用空格替换它会丢失信息:在出现空格的地方,文本呈现引擎不应放置换行符。
不间断空格的Unicode编码点是U+00A0,在Python中用Unicode字符串写成\xa0
。
UTF-8 U+00A0 的十六进制编码是两个字节序列 C2 A0,或者用 Python 字符串表示形式编写,\xc2\xa0
。在 UTF-8 中,超出 7 位 ASCII 集的任何内容都需要两个或更多字节来表示它。在这种情况下,设置的最高位是第八位。这意味着它可以用双字节序列(二进制)110xxxxx 10xxxxxx
表示,其中 x 是代码点的二进制表示的位。对于 A0,即 10000000
,或者当以 UTF-8 编码时,11000010 10000000
或 C2 A0。
许多人在 HTML 中使用
来获取不会被通常的 HTML 空白折叠规则折叠的空格(在 HTML 中,所有连续的空格、制表符和换行符都被解释为单个空格,除非应用了 CSS white-space
rules 之一),但这并不是它们真正的目的;它们应该用于名字之类的东西,比如“宫城先生”,你不希望“先生”之间有换行符。和“宫城”。我不确定为什么在这种特殊情况下使用它;它在这里似乎不合适,但这更多的是你的源代码的问题,而不是解释它的代码。
现在,如果您真的不关心布局,那么您不介意文本布局算法是否选择它作为换行的地方,但只想将其解释为常规空间,使用 NFKD 进行规范化是一个完全合理的答案(或者 NFKC,如果你更喜欢预组合的口音而不是分解的口音)。 NFKC and NFKD normalizations映射字符,以便在大多数上下文中表示基本相同语义值的大多数字符被扩展。例如,连字被展开 (ffi -> ffi),古式长 s 字符被转换为 s (ſ -> s),罗马数字字符被展开为它们的单个字母 (Ⅳ -> IV),以及不间断空格转换成普通空间。对于某些字符,NFKC 或 NFKD 规范化可能会丢失在某些上下文中很重要的信息:ℌ 和 ℍ 都将规范化为 H,但在数学文本中可以用来指代不同的事物。
关于python - Beautiful Soup 和 Unicode 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19508442/
我不知道“汤”字面意思在与计算机图形相关的“三角形汤”或“多边形汤”中使用时是什么意思。是不是和我们用勺子吃饭的“汤”有关? (我的母语不是英语。) 最佳答案 维基百科来拯救! A polygon s
我们正在废弃 Amazon.in 网站以检索任何产品的价格。所有产品在“span”标签中的“id”属性都具有不同的值,例如; id = 'priceblock_ourprice', id = 'p
我有一个这样的模板: 和这样的输入 HTML COMPLEX HTML 其中 COMPLEX_HTML 是很多子标签(很干净 - 验证) 我试图将输入 HTML 的 body 标记内的 HTML
我对 soup('tag_name') 和 soup.find_all('tag_name') 之间的区别感到困惑。下面是一个包含一小段 html 的示例: from bs4 import Beaut
我正在尝试使用 css 选择器解析 html 页面 import requests import webbrowser from bs4 import BeautifulSoup page = req
这是网页 HTML 源代码的一部分: apple banana cherry melon 我想提取我想要的网址,比如以/Result 开头的网址?我刚刚了解到您可以在 beautiful soup
我注意到一个非常烦人的错误:BeautifulSoup4(包:bs4)经常发现比以前版本(包:BeautifulSoup)更少的标签。 这是该问题的一个可重现的实例: import requests
所以我一直在试图弄清楚如何抓取一个购买/销售网站的网站,我发现了 HTML 中的所有内容,但该类包含不同的随机数,例如:
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwa
我正在尝试加载 html 页面并输出文本,即使我正确获取网页,BeautifulSoup 以某种方式破坏了编码。 来源: # -*- coding: utf-8 -*- import requests
题目地址:https://leetcode.com/problems/soup-servings/description/ 题目描述: There are two types of soup: t
您好,我正在尝试从网站获取一些信息。请原谅我,如果我的格式有任何错误,这是我第一次发布到 SO。 soup.find('div', {"class":"stars"}) 从这里我收到 我需要 “
我想从 Google Arts & Culture 检索信息使用 BeautifulSoup。我检查了许多 stackoverflow 帖子( [1] , [2] , [3] , [4] , [5]
我决定学习 Python,因为我现在有更多时间(由于大流行)并且一直在自学 Python。 我试图从一个网站上刮取税率,几乎可以获得我需要的一切。下面是来自我的 Soup 变量以及相关 Python
我正在使用 beautifulsoup 从页面中获取所有链接。我的代码是: import requests from bs4 import BeautifulSoup url = 'http://ww
我正在尝试根据部分属性值来识别 html 文档中的标签。 例如,如果我有一个 Beautifulsoup 对象: import bs4 as BeautifulSoup r = requests.ge
Показать телефон 如何在 Beautiful Soup 中找到上述元素? 我尝试了以下方法,但没有奏效: show = soup.find('div', {'class': 'acti
我如何获得结果网址:https://www.sec.gov/Archives/edgar/data/1633917/000163391718000094/0001633917-18-000094-in
我是 python 新手,尝试从页面中提取表格,但无法使用 BS4 找到该表格。你能告诉我我哪里出错了吗? import requests from bs4 import BeautifulSoup
我有一个巨大的 XML 文件(1.2 G),其中包含数百万个 MusicAlbums 的信息,每个 MusicAlbums 都具有如下简单格式 P 22 Exitos
我是一名优秀的程序员,十分优秀!