2016-04-06 41 views
0

模塊encoding提供不同的編碼,然後在HTML頁面請求模塊編碼提供不同的編碼然後HTML編碼

代碼的實際集編碼的請求:

import requests 
URL = "http://www.reynamining.com/nuevositio/contacto.html" 
obj = requests.get(URL, timeout=60, verify=False, allow_redirects=True) 
print obj.encoding 

輸出:

ISO-8859-1 

作爲實際的編碼集在HTML爲UTF-8content="text/html; charset=UTF-8"

我的問題是:

  1. 爲什麼requests.encoding呈現不同的編碼,然後在HTML頁面中描述的編碼?

我試圖編碼轉換爲UTF-8使用此方法objReq.content.decode(encodes).encode("utf-8"),因爲它已經在UTF-8當我與ISO-8859-1解碼和使用UTF-8編碼值得到改變IE)á對此的更改Ã

是否有任何方法將所有類型的編碼轉換爲UTF-8?

回答

3

要求設置response.encoding屬性ISO-8859-1當你有一個text/*響應,並沒有內容類型已指定的響應頭

Encoding section of the Advanced documentation

唯一一次請求不會做到這一點,如果沒有明確的字符集是存在於HTTP頭Content-Type頭包含text在這種情況下,RFC 2616指定默認字符集必須是ISO-8859-1。在這種情況下,請求遵循規範。如果您需要不同的編碼,您可以手動設置Response.encoding屬性,或使用原始Response.content

大膽重視我的。

您可以通過尋找charset參數在Content-Type頭測試此:

resp = requests.get(....) 
encoding = resp.encoding if 'charset' in resp.headers.get('content-type', '').lower() else None 

你的HTML文檔指定的<meta>頭的內容類型,它是這頭是權威:

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

HTML 5也限定了<meta charset="..." />標籤,見<meta charset="utf-8"> vs <meta http-equiv="Content-Type">

您應該而不是將HTML頁面重新編碼爲UTF-8(如果它們包含具有不同編解碼器的此類標頭)。在這種情況下,您至少必須在正確的標題

使用BeautifulSoup:

# pass in explicit encoding if set as a header 
encoding = resp.encoding if 'charset' in resp.headers.get('content-type', '').lower() else None 
content = resp.content 
soup = BeautifulSoup(content, from_encoding=encoding) 
if soup.original_encoding != 'utf-8': 
    meta = soup.select_one('meta[charset], meta[http-equiv="Content-Type"]') 
    if meta: 
     # replace the meta charset info before re-encoding 
     if 'charset' in meta.attrs: 
      meta['charset'] = 'utf-8' 
     else: 
      meta['content'] = 'text/html; charset=utf-8' 
    # re-encode to UTF-8 
    content = soup.prettify() # encodes to UTF-8 by default 

類似地,其它文檔標準也可以指定特定的編碼; XML例如始終是UTF-8,除非由<?xml encoding="..." ... ?> XML聲明指定,這也是文檔的一部分。

+0

非常感謝,它非常豐富:)。 – The6thSense

+0

給出的代碼片斷會爲'URL'產生'None'類型的錯誤,例如'http://www.uraniumenergy.com/contact_us/contact_information '請問爲什麼會發生這種情況以及如何避免它? – The6thSense

+0

@ The6thSense:不知道;我嘗試時沒有遇到任何錯誤。你有追溯嗎? –

2

請求將首先檢查在HTTP標題中的編碼:

print obj.headers['content-type'] 

輸出:

text/html 

不能正確分析編碼的猜測的類型因此它指定默認ISO-8859-1 。請參閱docs

+0

謝謝隊友:)。 – The6thSense