2014-03-01 36 views
1

我使用請求來檢索包含一些unicode字符,並希望做一些處理,然後寫出來的url。lxml.html解析和utf-8與請求

r=requests.get(url) 
f=open('unicode_test_1.html','w');f.write(r.content);f.close() 
html = lxml.html.fromstring(r.content) 
htmlOut = lxml.html.tostring(html) 
f=open('unicode_test_2.html','w');f.write(htmlOut);f.close() 
在unicode_test_1.html

,所有的字符看起來不錯,但在unicode_test_2.html,一些字符變爲亂碼,這是爲什麼?

我又試圖

html = lxml.html.fromstring(r.text) 
htmlOut = lxml.html.tostring(html,encoding='latin1') 
f=open('unicode_test_2.html','w');f.write(htmlOut);f.close() 

似乎它的工作現在。但我不知道爲什麼會發生這種情況,總是使用latin1? r.text和r.content有什麼區別,爲什麼我不能使用encoding='utf-8'寫出html?

回答

2

如果您使用的是Python 2或3,則尚未指定。根據所使用的版本,編碼處理方式會有很大不同。無論如何,以下建議或多或少都是通用的。

r.text和r.content之間的區別在Requests文檔中。簡單地說,請求會試圖找出你的字符編碼,並在解碼之後返回Unicode。這可以通過r.text訪問。要獲取字節,請使用r.content。

你真的需要去掌握編碼。閱讀http://www.joelonsoftware.com/articles/Unicode.html並觀看https://www.youtube.com/watch?v=sgHbC6udIqc即可開始使用。此外,請搜索「克服挫折:正確使用python2中的unicode」以獲取更多幫助。

只是爲了澄清,它並不像總是使用一種編碼那麼簡單。通過以字節爲單位進行任何I/O操作來製作Unicode三明治,並在應用程序中使用Unicode。如果從字節開始(isinstance(mytext,str)),則需要知道要解碼爲Unicode的編碼,如果以Unicode(isinstance(mytext,unicode))開頭,則應將其編碼爲UTF-8,因爲它將處理所有世界人物。

確保你的編輯器,文件,服務器和數據庫都配置爲UTF-8,否則你會得到更多'亂碼'。

如果您想要進一步的幫助發佈源文件和腳本的輸出。

+0

你推薦的閱讀/視頻資源真的爲我清除了一些東西。謝謝。 – dmoench