2010-12-10 49 views
0

我是新来的python,并试图使用urllib2/lxml来获取和解析页面。一切似乎都很好,除了解析的页面在我的浏览器中打开时似乎嵌入了奇怪的字符。我猜这是一个unicode/lxml解析问题。当我得到一个元素的文本内容,使用.text_content(),并打印它时,我在原始页面中获得诸如“sometext \ 342 \ 200 \ 223 moretext”之类的东西,这显示为“sometext - moretext”urllib2/lxml编码问题

有谁能告诉我:
1.发生了什么事?
2.我该如何解决?
3.我可以在哪里阅读这些编码问题?

谢谢!

+0

你能不能举个例子?无论是代码还是准确的结果,不仅仅是“像”blabla“”之类的东西,或者最好是两者。另外,我们正在谈论蟒蛇2或3? – 2010-12-10 22:31:14

+0

你可以粘贴一些代码,并确切显示发生了什么? – 2010-12-10 22:31:33

回答

2

什么是去这个网站使用的是一个“短线”,这是一个稍长一点的短线(你应该在40-56之间使用,例如40-56)。是的,破折号本身就是一门完整的科学)。

在Unicode中,endash的代码点为U + 2013。您获得的数字\ 342 \ 200 \ 223是该代码点的UTF-8编码的八进制表示。为什么你得到八进制我不知道,我得到十六进制,所以在我的电脑上它看起来像'\ xe2 \ x80 \ x93'。但这没有什么区别,那只是代表。数字是一样的。

你应该做的是尽可能早地解码你得到的unicode的HTML字符串。当你抓取页面时,你得到的头文件应该告诉你它使用了什么编码(尽管这里显然是UTF8),从头文件中提取数据相当容易,打印出头文件时你会看到它。

你然后解码HTML数据:

htmldata = htmldata.decode(<the encoding you found in the headers>) 
+0

将数据传递给其他程序时数据是否应保留为unicode?我目前使用thrift/pb序列化数据(以及后来通过非unicode感知的C/C++程序读取),处理这个问题的最佳方法是什么?可以自由地在ISO-8859-1和UTF-8之间转换吗?也就是说,如果C++程序被移植到需要注意的地方,并期望以UTF-8格式输入所有内容,那最好吗?谢谢! – 2010-12-11 06:18:29

+0

@Toki Tom:请参阅http://docs.python.org/howto/unicode.html#tips-for-writing-unicode-aware-programs了解如何编写支持unicode的程序。 UTF-8可以表示所有的unicode代码点(其中有超过一百万个)。见http://en.wikipedia.org/wiki/UTF-8。 ISO-8859-1可以表示256个码点。见http://en.wikipedia.org/wiki/ISO/IEC_8859-1。 U + 0000和U + 00FF之间的代码点映射到UTF-8和ISO-8859-1中的相同字节值,因此从ISO-8859-1到UTF-8的转换实际上只是标识映射。但并非所有UTF-8都可以解码为Unicode并重新编码为ISO-8859-1。 – unutbu 2010-12-11 11:28:21

+0

@Toki Tom:其他“程序”no。你不能把它作为Unicode。 Unicode是*不是一种编码数据的方式。当你想从一个软件到另一个软件交换unicode数据时,你需要用编码进行编码,比如UTF8或Latin-1。 当把它发送给其他Python函数时,你可以把它保留为Unicode。 – 2010-12-11 14:18:06

0

你主要是需要铭记的unicode的问题在两个点的过程中:

  1. 得到的回应为unicode字符串,nicely explained here on SO
  2. 输出字符串
时指定一个合适的编码

-

# from an lxml etree 
etree.tostring(root, encoding='utf-8', xml_declaration=False) 

# from a unicode string 
x.encode('utf-8')