我正在使用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属性中看到了这一点:
<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,则这样的注释建议: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,我以为BeautifulSoup会提取该数据进行编码?为什么不将其替换为<space>
?
2-有一种通用的方式来标准化空格以进行转换吗?
3-当我编码为UTF8时,\xa0
的序列在\xc2\xa0
哪里?
我可以通过所有方法unicodedata.normalize('NFKD',string)
来帮助我到达自己想去的地方,但是我很想了解问题所在,并避免以后再出现此类问题。
您没有遇到任何问题。一切都按预期进行。
表示不间断的空格字符。它不会被空格代替,因为它不代表空格。它代表着一个不间断的空间。用空格代替它会丢失信息:在该空格出现的地方,文本呈现引擎不应放置换行符。
不间断空格的Unicode代码点是U + 00A0,它在Python中以Unicode字符串形式编写为\xa0
。
U + 00A0的UTF-8编码为十六进制的两个字节序列C2
A0,或以Python字符串表示形式编写\xc2\xa0
。在UTF-8中,超出7位ASCII集的任何内容都需要两个或更多字节来表示。在这种情况下,最高位设置为第八位。这意味着它可以由两字节序列(二进制)表示110xxxxx 10xxxxxx
,其中x是代码点的二进制表示形式的位。如果是A0,则为10000000
,或者使用UTF-811000010 10000000
或C2
A0进行编码。
许多人使用
HTML来获取通常的HTML空白折叠规则不会折叠的空间(在HTML中,除非应用了CSSwhite- space
规则之一,否则所有连续的空格,制表符和换行符都将被解释为单个空格),但这并不是他们真正想要的。它们应该用于诸如“宫城先生”之类的名字,而您不希望在“先生”之间使用换行符。和“宫城”。我不确定为什么在这种特殊情况下使用它。它似乎在这里不合适,但这更多是源代码的问题,而不是解释它的代码。
现在,如果您不太在意布局,那么您就不必在乎文本布局算法是否选择将其作为包装的地方,而只想将其解释为常规空间,使用NFKD进行标准化是非常合理的答案(如果您更喜欢预合成的重音而不是分解的重音,则为NFKC)。该NFKC和NFKD归一映射字符,以便扩展在大多数上下文中表示基本相同语义值的大多数字符。例如,扩展连字(ffi->
ffi),将过时的long s字符转换为s(ſ-> s),将罗马数字字符扩展为它们的单个字母(Ⅳ->
IV),并且不间断空格转换为正常空间。对于某些字符,NFKC或NFKD归一化可能会丢失在某些情况下很重要的信息:ℌ和ℍ都将归一化为H,但在数学课本中可以用来指代不同的事物。
问题内容: 我正在尝试从Google搜索结果中提取链接。检查元素告诉我,我感兴趣的部分具有“ class = r”。第一个结果如下所示: 要提取“ href”,我要做: 但是我意外地得到: 我想要的地方: 属性“ ping”似乎使它感到困惑。有任何想法吗? 问题答案: 发生了什么? 如果您打印响应内容(即),则会看到您得到的HTML完全不同。页面源和响应内容不匹配。 因为内容是动态加载的,所以 不
下面是一个网络刮刀,它用漂亮的汤从这个网站上刮出一个团队名单。每一列数据都被放入一个数组,然后循环到一个CSV文件中。我想刮掉团队名称(代码中的“团队”),但我正在努力将元标记(见下文的html代码)合并到我的CSV写入器循环中。 我认为问题在于“Team”数组中的值长度与其他列中的值长度不匹配。例如,我当前的代码打印的数组如下所示: 但我需要团队数组(最后一个数组)匹配前两个数组的长度,如下所示
我希望从< code>div内的标题和< code >内的文本中提取文本字符串 我可以用<code>汤得到标题。h1</code>,但我想获得特定于div<code>中的<code>h1</code> 超文本标记语言:
问题内容: 我正在尝试解析一个网站,并通过BeautifulSoup.findAll获取一些信息,但它并没有全部找到。.我正在使用python3 代码是这个 它只打印其中一半… 问题答案: 不同的HTML解析器对损坏的HTML的处理方式不同。该页面提供了损坏的HTML,解析器对此的处理不佳: 标准库在此特定页面上的麻烦较少: 使用将其转换为您的特定代码示例,您将这样指定解析器:
我试图抓取德国聚会的新闻页面,并将所有信息存储在数据框中(“蟒蛇初学者”)。当我想将整个文本甚至日期存储到数据框中时,只存在一个小问题。似乎只有文本的最后一个元素(p... /p)将被存储在行中。我认为问题的出现是因为循环上的迭代是误导的。
问题内容: 我正在尝试在以下html代码中检索一些标签。这只是一部分 您可以在这里找到该网页 我的Python代码如下 但是text变量为空,如果我打印div变量,除了标签外,我上面的HTML完全一样。 问题答案: BeautifulSoup可以使用不同的解析器来处理HTML输入。此处的HTML输入有些破损,并且默认的解析器不能很好地处理它。 改用解析器:
我试图抓取这个网站:https://www.senate.gov/general/contact_information/senators_cfm.cfm 我的代码: 问题是它实际上并没有到达网站。我在soup var中得到的HTML根本不是正确网页中的HTML。 我不知道从这里去哪里!任何和所有的帮助都将不胜感激。
考虑一下这段代码: 它只打印“divTag” 更新: 我基本上想在'a'标签中提取“字符串”值。