python selenium 編碼問題

來源:互聯網
上載者:User

標籤:www   close   字元集   webdriver   不同   page   python   alt   ice   

#coding=utf-8from selenium import webdriverdriver = webdriver.Firefox()driver.get("http://www.baidu.com")# 返回百度頁面底部備案資訊text = driver.find_element_by_id("cp").textprint(text)driver.close()

 

認識常見編碼

 

  GB2312是中國規定的漢字編碼,也可以說是簡體中文的字元集編碼

  GBK 是 GB2312的擴充 ,除了相容GB2312外,它還能顯示繁體中文,還有日文的假名

  cp936:中文本地系統是Windows中的cmd,預設codepage是CP936,cp936就是指系統裡第936號編碼格式,即GB2312的編碼。

    (當然有其它編碼格式:cp950 繁體中文、cp932 日語、cp1250 中歐語言。。。)

  Unicode是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。UTF-8、UTF-16、UTF-32都是將數字轉換到程式資料的編碼方案。

  UTF-8 (8-bit Unicode Transformation Format)是最流行的一種對 Unicode 進行傳播和儲存的編碼方式。它用不同的 bytes 來表示每一個代碼點。ASCII 字元每個只需要用一個 byte ,與 ASCII 的編碼是一樣的。所以說 ASCII 是 UTF-8 的一個子集。

 

在開發Python程式的過程中,會涉及到三個方面的編碼:

  • Python程式檔案的編碼
  • Python程式運行時環境(IDE)的編碼
  • Python程式讀取外部檔案、網頁的編碼

 

Python程式檔案的編碼

例如:

Python2內建的IDE,當建立了一個檔案儲存的時候提示:

  這是因為Python2編輯器預設的編碼是ASCII,它是無法識別中文的,所以會彈出這樣的提示。這也是我們在大多情況下寫python2程式的時候習慣在程式的第一行加上:#coding=utf-8

  其實,這裡的編碼檔案是很容易解決的。

 

 

Python程式運行時環境(IDE)的編碼

  

執行下面的一段程式。

#coding=utf-8from selenium import webdriverdriver = webdriver.Firefox()driver.get("http://www.baidu.com")# 返回百度頁面底部備案資訊text = driver.find_element_by_id("cp").textprint(text)driver.close()

在windows cmd下執行:

 

我們要擷取的資訊是:

?2015 Baidu 使用百度前必讀 意見反饋 京ICP證030173號

  Windows cmd 用的是cp936,也就是中文的GB2312,在GBK的字元集裡沒有“?”,這就導致通過GBK解析的時候出現編碼問題。

  這就像你在翻譯英文的時候,出現了一個單詞,這個單詞你查遍了牛津大詞典都沒找到對應的含義解釋,那麼自然是會有問題的。

  那假設,我還就想在cmd下執行這個python程式了,那麼可以去修改cmd的預設編碼類別型為utf-8,對應的編碼為CHCP 65001(utf-8)。在cmd 下輸入:chcp 65001 命令斷行符號。

然後,修改cmd的字型為“Lucida Console”,再來執行程式就可以被正確輸出了。

 

 

Python程式讀取外部檔案、網頁的編碼

 

#這一塊,暫時沒有找到合適的例子

 

 

查看Python系統編碼

查看Python2 或Python3的系統編碼。

Python2:

Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32Type "copyright", "credits" or "license()" for more information.>>> import sys>>> sys.getdefaultencoding()‘ascii‘

Python3:

Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32Type "copyright", "credits" or "license()" for more information.>>> import sys>>> sys.getdefaultencoding()‘utf-8‘

 

那麼如何修改Python2的系統編碼為urf-8呢?

import sysreload(sys)sys.setdefaultencoding(‘utf-8‘)

 

所以,在你的程式執行的過程中,遇到下面的報錯資訊時。

UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1....

可以將上面的三行代碼加到Python程式的頭部。

 

 

decode()與encode()

 

  • decode 的作用是將其他編碼的字串轉換成 Unicode 編碼,eg name.decode(“GB2312”),表示將GB2312編碼的字串name轉換成Unicode編碼。
  • encode 的作用是將Unicode編碼轉換成其他編碼的字串,eg name.encode(”GB2312“),表示將GB2312編碼的字串name轉換成GB2312編碼。

  例如,前面擷取百度底部資訊的例子。我還可以通過decode()與encode()來解決:

#coding=utf-8from selenium import webdriverdriver = webdriver.Chrome()driver.get("http://www.baidu.com")# 返回百度頁面底部備案資訊text = driver.find_element_by_id("cp").texttext2 = text.encode("gbk","ignore").decode("gbk")print(text2)

   這裡通過encode()將Unicode編碼轉換成gbk編碼,在轉換的過程中通過“ignore”忽略掉gbk不能識別的字元(?),然後再把gbk轉換成Unicode編碼。當然,這並不是一種完美的方式,畢竟犧牲部分字串。

 

 

chardet模組

 chardet是一個非常優秀的編碼識別模組。

通過pip 安裝:

>pip install chardet

 使用:

>>> from chardet import detect>>> a = "中文">>> detect(a){‘confidence‘: 0.682639754276994, ‘encoding‘: ‘KOI8-R‘}

 大概有68%的把握為KOI8-R編碼類別型。

 

python selenium 編碼問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.