2024年6月30日 星期日

requests 的 encoding 問題

今天在用 requests 爬 https://books.toscrape.com 網站上的書價時遇到英鎊符號出現亂碼問題 (這個書籍網站上的書價均以英鎊計價), 我找到下面這篇文章去測試也沒用, 所以先記下來 : 





檢視原始碼只有英鎊符號 : 

<p class="price_color">£51.77</p>

但是用 requests 去抓卻在英鎊符號前面出現一個額外的亂碼 Â : 

>>> import requests     
>>> from bs4 import BeautifulSoup   
>>> url=f'https://books.toscrape.com/'     
>>> res=requests.get(url)    
>>> soup=BeautifulSoup(res.text, 'lxml')    
>>> prices=soup.select('article > div.product_price > p.price_color')      
>>> prices[0].text     
'£51.77'

檢查 encoding 發現編碼是 ISO-8859-1 (即 LATIN-1) :
 
>>> res.encoding      
'ISO-8859-1'

但檢視原始碼的 meta 標籤, charset 是 UTF-8 編碼 : 

<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

好奇怪, requests 不是會根據網頁 meta 標籤內的 charset 屬性自動辨別網頁的編碼格式嗎? 為何明明是 utf-8 卻把 encoding 設為 ISO-8859-1 ?

將 encoding 改成 'utf-8' 還是一樣沒有用 :

>>> res.encoding='utf-8'   
>>> prices[0].text    
'£51.77'

好像在哪裡看過說編碼轉換成 utf-8 也不見得會完全成功, 不知道這是不是這種情形. 

沒有留言 :