Python - HTML转Unicode
我有一个Python脚本,用来获取一些HTML内容,并使用Beautiful Soup来解析它。在这些HTML中,有时候会出现没有Unicode字符的情况,这就导致我的脚本和我创建的文件出错。
这是我获取HTML的方式:
html = urllib2.urlopen(url).read().replace(' ',"")
xml = etree.HTML(html)
当我使用这个时:
html = urllib2.urlopen(url).read().encode('ascii', 'xmlcharrefreplace')
我遇到了一个错误,叫做UnicodeDecodeError
。
我该如何将其转换为Unicode呢?这样如果出现非Unicode字符,我的代码就不会崩溃了。
2 个回答
如果你把HTML代码给BeautifulSoup,它会把这些代码转换成Unicode格式。
不过,如果字符集的声明不正确或者缺失,或者文档的某些部分用不同的编码方式,这个过程可能会失败。为了处理这些情况,BeautifulSoup里有一个特别的模块叫做dammit
,它可能会帮你解决这些问题。
提到BeautifulSoup的时候,为什么不这样做呢:
from bs4 import BeautifulSoup
soup = BeautifulSoup(urllib2.urlopen(url).read())
然后就可以和这个“汤”一起工作了?顺便说一下,所有的HTML实体都会被转换成Unicode字符。
ascii
字符集非常有限,可能会缺少你文档中的很多字符。所以我建议尽量使用utf-8
编码。
当我使用这个
html = urllib2.urlopen(url).read().encode('ascii', 'xmlcharrefreplace')
我遇到了一个错误,叫做 UnicodeDecodeError。我该如何将其转换为 Unicode 呢?
- unicode 字符 -> 字节 = ‘编码’
- 字节 -> unicode 字符 = ‘解码’
你现在有的是字节,想要得到 unicode 字符,所以你需要用 decode
这个方法。你之前用的是 encode
,Python 以为你想把字符转换成字节,所以它试图把字节转换成字符,然后再变回字节!它使用的是默认的编码方式,在你的情况下是 ASCII,因此对于非 ASCII 字节就会出错。
不过,为什么你想这么做其实不太清楚。etree
可以直接处理字节。如果你想从数据中去掉字符 U+00A0(非断行空格),应该在 HTML 解析后处理提取的内容,而不是去纠结于 HTML 源代码。HTML 标记可能会包含 U+00A0 作为原始字节,或者有错误的未结束实体引用、数字字符引用等等。让 HTML 解析器来处理这些,它是擅长这个的。