通常,使用r.text
而不是使用r.content
這是接收到的字節字符串,它是使用由requests
確定的編碼的解碼內容。
在這種情況下requests
將使用UTF-8到到來的字節串進行解碼,因爲這是由服務器在Content-Type
頭報告的編碼:然而
import requests
r = requests.get('http://fm4-archiv.at/files.php?cat=106')
>>> type(r.content) # raw content
<class 'bytes'>
>>> type(r.text) # decoded to unicode
<class 'str'>
>>> r.headers['Content-Type']
'text/html; charset=UTF-8'
>>> r.encoding
'UTF-8'
>>> soup = BeautifulSoup(r.text, 'lxml')
這將修復「Wildlöwenpfleger」的問題, ,頁面的其他部分,然後開始打破,例如:
>>> soup = BeautifulSoup(r.text, 'lxml') # using decoded string... should work
>>> soup.find_all('a')[39]
<a href="details.php?file=1882">Der Wildlöwenpfleger</a>
>>> soup.find_all('a')[10]
<a href="files.php?cat=87" title="Stermann und Grissemann sind auf Sommerfrische und haben Hermes ihren Salon �bergeben. Auf Streifz�gen durch die Popliteratur st��t Hermes auf deren gro�e Themen und h�rt mit euch quer. In der heutige">Salon Hermes (6 files)
顯示,「Wildlöwenpfleger」是固定的,但現在「übergeben」等人在第二個鏈接被打破。
似乎在一個HTML文檔中使用了多種編碼。第一個環節使用UTF-8編碼:
>>> r.content[8013:8070].decode('iso-8859-1')
'<a href="details.php?file=1882">Der Wildlöwenpfleger</a>'
>>> r.content[8013:8070].decode('utf8')
'<a href="details.php?file=1882">Der Wildlöwenpfleger</a>'
但第二個鏈接使用ISO-8859-1編碼:
>>> r.content[2868:3132].decode('iso-8859-1')
'<a href="files.php?cat=87" title="Stermann und Grissemann sind auf Sommerfrische und haben Hermes ihren Salon übergeben. Auf Streifzügen durch die Popliteratur stößt Hermes auf deren große Themen und hört mit euch quer. In der heutige">Salon Hermes (6 files)\r\n</a>'
>>> r.content[2868:3132].decode('utf8', 'replace')
'<a href="files.php?cat=87" title="Stermann und Grissemann sind auf Sommerfrische und haben Hermes ihren Salon �bergeben. Auf Streifz�gen durch die Popliteratur st��t Hermes auf deren gro�e Themen und h�rt mit euch quer. In der heutige">Salon Hermes (6 files)\r\n</a>'
顯然,這是不正確相同的HTML文檔中使用多種編碼。除了聯繫文檔的作者並要求更正外,您無法輕鬆地處理混合編碼。也許你可以在處理數據時對數據運行chardet.detect()
,但這並不令人愉快。