2

我正在使用BeautifulSoup4做一些網頁抓取,並且遇到解碼響應問題。網站返回我的標題,在標題中說:使用BeautifulSoup刮取網站時的字符編碼問題

content-type:text/html; charset = ISO-8859-1

所以通常我用latin1字符集來解碼它。但隨後在解碼之後,有在HTML中的線,即表示:

<元含量= 「text/html的;字符集= UTF-8」 HTTP-當量= 「內容類型」/ >

現在從這一行開始字符串沒有正確解碼。

那麼處理這個問題的正常方法是什麼?我想在傳出的http頭文件中設置accept-encoding行,但找不到執行此操作的方法。另一種選擇是解碼逐行尋找新的字符集,但寧願這樣做只是只接受比較UTF-8

我用Python3,libray http.client

EDIT1: 代碼:

import http.client as cl 
from bs4 import BeautifulSoup 

conn = cl.HTTPConnection('www.amazon.com') 
conn.request("GET", '/A-Man-For-All-Seasons/dp/B003TQ1IW6/ref=sr_1_109?s=instant-video&ie=UTF8&qid=1348337540&sr=1-109') 
response = conn.getresponse() 
content = response.read() 

soup = BeautifulSoup(content) 
f = open('am.html', 'w') 
f.write(soup.prettify()) 

#i am actually doing this with httplib2 but result is the same 

編輯2: 看起來像在Linux中配置Beautiful Soup 4真的是錯誤的,或者它是一個錯誤。 這是工作,但我不能BS4解析響應:

import httplib2 
h = httplib2.Http('.cache') 
response, content = h.request(movieLink , headers={'accept-charset': 'latin1'}) 
content = content.decode('latin-1') 

謝謝你,Blckknght。

+0

你的代碼適用於我(在Python 3.2.3和Beautiful Soup 4.1.3的Windows上)。我沒有在輸出文件中弄亂任何東西。 – Blckknght

+0

不只是使用亞馬遜的API的任何理由?哦,歡迎來到SO! – vzwick

+0

默認設置正確的請求標題和編碼可以解決這個問題,http://www.datascraping.co/doc/questions/21/encoding-problem-in-website-scraping – Vicky

回答

4

通過Beautiful Soup documentation閱讀它看起來像有兩種體面的方法。

  1. 最好的解決辦法可能是自己不解碼HTML文件,只是給原始字節串到美味的湯。它會找出正確的編碼,並自動解碼文檔(使用其包含的Unicode Dammit庫)。它會找到並解釋相關的HTML元標記,或者分析文檔的內容並進行猜測。這當然應該解決你的情況,即使沒有meta標籤的文檔,它也可能在大多數情況下都適用。掃描文檔可能會有點慢,所以如果性能是一個重大問題,您可能更喜歡下一個選項。

  2. 下一個最佳解決方案可能是將您自己的知識應用於該問題。如果您正在抓取的頁面始終編碼爲UTF-8,則無論服務器說什麼,都可以簡單地使用該頁面。這當然取決於頁面編碼是否一致,這可能是也可能不是這種情況(例如一個網站有一些UTF-8頁面和一些拉丁文頁面)。如果您只抓取一個頁面(或一個動態網站上的單一頁面類型),您總是可以找到相同的編碼,所以這可以很好地工作。這種方法的優點在於其簡單性(速度較慢),但其代價是靈活性和穩健性。如果網站更改其使用的編碼,您的腳本可能會中斷。

+0

謝謝。這解決了手動檢查每個站點進行編碼的問題,但仍然沒有解決這個問題。自動BS4解碼器給我的輸出是這樣的:http://goo.gl/GbLzf – Ozbolt

+0

你能用你正在使用的代碼更新問題嗎?我不確定文件如何受到如此嚴重的損壞。 – Blckknght

+0

你也可以看一下http://scriptcult.com/subcategory_176/article_852-use-beautifulsoup-unicodedammit-with-lxml-html.html以獲得正確使用Dammit的感覺 –

0

這可能是BeautifulSoup not reading documents correctly的副本,即是由BS 4.0.2中的bug造成的。

該錯誤已在4.0.3中修復。您可能需要檢查輸出

>>> import bs4 
>>> bs4.__version__ 

如果是4.0.2,請將BeautifulSoup升級到更高版本。