urllib2/lxml 编码问题
我刚开始学Python,想用urllib2和lxml来获取和解析一个网页。整体上都很顺利,但当我在浏览器中打开解析后的页面时,发现里面有些奇怪的字符。我猜这可能是unicode或lxml解析的问题。当我用.text_content()获取某个元素的文本内容并打印出来时,看到的内容像这样:“sometext \342\200\223 moretext”,在原始页面上显示为“sometext - moretext”。
有人能告诉我:
1. 这是怎么回事?
2. 我该怎么解决?
3. 我可以在哪里了解这些编码问题?
谢谢!
2 个回答
0
在这个过程中,你主要需要注意两个地方的unicode问题:
- 把响应内容转换成unicode字符串,在这里有个很好的解释
- 在输出字符串时,指定合适的编码方式
--
# from an lxml etree
etree.tostring(root, encoding='utf-8', xml_declaration=False)
# from a unicode string
x.encode('utf-8')
2
发生的事情是,这个网站使用了一个叫“短横线”的符号,它比普通的横线稍长一点(其实在表示范围时,比如40-56,应该用这个短横线)。对了,横线的用法真的是一门学问。
在Unicode中,短横线的编码是U+2013。你看到的数字 \342\200\223 是这个编码在UTF-8格式下的八进制表示。至于为什么你看到的是八进制,我就不太清楚了,我看到的是十六进制,所以在我的电脑上它看起来像是'\xe2\x80\x93'。不过这没什么区别,都是表示同一个东西。数字是一样的。
你可能应该尽早把你得到的HTML字符串解码成Unicode。你在获取页面时返回的头信息应该会告诉你它使用的编码(虽然在这里显然是UTF-8),从头信息中提取这些数据其实很简单,当你打印出头信息时就能看到。
然后你就可以解码HTML数据:
htmldata = htmldata.decode(<the encoding you found in the headers>)