2010-12-10 74 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')