2014-11-03 77 views
0

我有一个Python脚本,我得到一些HTML和解析它使用美丽的汤。在HTML中,有时候没有unicode字符,它会导致我的脚本和我创建的文件出错。Python - HTML到Unicode

这里是我如何获得HTML

html = urllib2.urlopen(url).read().replace(' ',"") 
xml = etree.HTML(html) 

当我使用这个

html = urllib2.urlopen(url).read().encode('ascii', 'xmlcharrefreplace') 

我得到一个错误UnicodeDecodeError

我怎么会变成这样的unicode。所以如果有非Unicode字符,我的代码不会中断。

+0

[将HTML实体转换为Unicode,反之亦然](http:// stackoverflow。com/questions/701704/convert-html-entities-to-unicode-反之亦然) – 2014-11-03 20:58:24

+0

@AlexThornton当我使用它时,我得到一个错误UnicodeDecodErro – iqueqiorio 2014-11-03 21:00:49

+0

你能给一个例子输入和输出字符串的例子,你可能会期待? – 2014-11-03 21:15:45

回答

0

当我使用这个

html = urllib2.urlopen(url).read().encode('ascii', 'xmlcharrefreplace') 

我得到一个错误的UnicodeDecodeError。我怎么能把它改成unicode。

  • Unicode字符 - >字节= '编码'
  • 字节 - > Unicode字符= '解码'

你有个字节,你想Unicode字符,所以该方法是decode。正如你已经使用encode,Python认为你想从字符到字节,所以试图将字节转换为字符,以便他们可以转回到字节!它使用默认的编码,在你的情况下是ASCII,所以它对非ASCII字节失败。

但是目前还不清楚为什么要这样做。 etree按原样解析字节。如果你想从你的数据中删除字符U + 00A0 Non Breaking Space,你应该使用HTML解析后提取的内容来做到这一点,而不是试图解决HTML源代码版本问题。 HTML标记可能包括U + 00A0作为原始字节,错误未终止的实体引用,数字字符引用等等。让HTML解析器为你处理,这就是它擅长的。

0

如果您将HTML提供给BeautifulSoup,它会将其解码为Unicode。 如果字符集声明错误或丢失,或者文档的部分编码方式不同,则可能会失败;有一个与BeautifulSoup,dammit,这可能会帮助你与这些文件的特殊模块。

如果您提及BeautifulSoup,你为什么不去做这样的:

from bs4 import BeautifulSoup 
soup = BeautifulSoup(urllib2.urlopen(url).read()) 

,并与汤的工作?顺便说一下,所有的HTML实体都将被解析为unicode字符。

ascii字符集非常有限,可能缺少文档中的许多字符。我会尽可能使用utf-8