Python urllib2/lxml编码问题

Python urllib2/lxml编码问题,python,unicode,encoding,utf-8,lxml,Python,Unicode,Encoding,Utf 8,Lxml,我是python新手,尝试使用urllib2/lxml获取和解析页面。一切似乎都很正常,除了在我的浏览器中打开解析后的页面时,页面中似乎嵌入了奇怪的字符。我猜这是一个unicode/lxml解析问题。当我使用.text\u content()获取元素的文本内容并将其打印出来时,我会在原始页面中得到类似“sometext\342\200\223 moretext”的内容,这显示为“sometext-moretext” 谁能告诉我: 1.发生了什么事? 2.如何修复它? 3.我在哪里可以读到像这样的

我是python新手,尝试使用urllib2/lxml获取和解析页面。一切似乎都很正常,除了在我的浏览器中打开解析后的页面时,页面中似乎嵌入了奇怪的字符。我猜这是一个unicode/lxml解析问题。当我使用.text\u content()获取元素的文本内容并将其打印出来时,我会在原始页面中得到类似“sometext\342\200\223 moretext”的内容,这显示为“sometext-moretext”

谁能告诉我:
1.发生了什么事?
2.如何修复它?
3.我在哪里可以读到像这样的编码问题


谢谢

在这个过程中,您主要需要注意两个方面的unicode问题:

  • 将响应转换为unicode字符串
  • 输出字符串时指定合适的编码
  • --


    现在的情况是,网站使用了一个“endash”,这是一个稍长的破折号(你应该在40-56的范围内使用这个破折号,真的。是的,破折号本身就是一门完整的科学)

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

    您可能应该做的是尽早将得到的HTML字符串解码为unicode。获取页面时返回的页眉应该告诉您它使用了什么编码(虽然这里显然是UTF8),从页眉中提取数据相当容易,打印页眉时就会看到

    然后对html数据进行解码:

    htmldata = htmldata.decode(<the encoding you found in the headers>)
    
    htmldata=htmldata.decode()
    
    你能举个例子吗?要么是代码,要么是准确的结果,而不仅仅是“blabla”之类的东西,或者最好是两者兼而有之。另外,我们讨论的是Python2还是Python3?您能粘贴一些代码并准确显示发生了什么吗?在将数据传递给其他程序时,是否应该将其保留为unicode?我目前使用thrift/pb(以及后来由不支持unicode的C/C++程序读取)序列化数据,处理这个问题的最佳方法是什么?可以在ISO-8859-1和UTF-8之间自由转换吗?也就是说,如果C++程序移植到意识到,并且期望UTF-8中的所有输入,那会是最好的吗?谢谢大家!@Toki Tom:有关编写支持unicode的程序的提示,请参阅。UTF-8可以表示所有unicode代码点(超过一百万个)。看见ISO-8859-1可以表示256个代码点。看见U+0000和U+00FF之间的代码点映射到UTF-8和ISO-8859-1中相同的字节值,因此从ISO-8859-1到UTF-8的转换实际上只是标识映射。但并非所有的UTF-8都可以解码为unicode并重新编码为ISO-8859-1。@Toki Tom:其他“程序”不可以。不能将其保留为unicode。Unicode不是一种编码数据的方法。当您想将unicode数据从一个软件交换到另一个软件时,您需要使用编码(如UTF8或Latin-1)对其进行编码。当将它发送到其他Python函数时,您当然可以将其保留为Unicode。@unutbu,@Lennart:为了清楚起见,我应该始终能够从ascii和ISO-8859解码为UTF-8,这似乎是最流行的编码。在python中工作时,我应该始终将我得到的任何编码解码为unicode(使用.decode()函数)。序列化数据时,我应该将.encode()解码为我想要使用的任何编码(UTF-8似乎是最好的)。如果读取序列化数据的程序不理解UTF-8(例如,仅ascii),然后它将得到两个代码点相同的代码点,但其他所有代码点都将是乱七八糟的。所有正确吗?而且,由于上面的空格已用完,多亏了你们两位:)。
    htmldata = htmldata.decode(<the encoding you found in the headers>)