2016-04-06 4 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ページで説明エンコーディングを別のエンコーディングを示しています?。

私はISO-8859-1でデコードし、すなわち値が変更を取得UTF-8でエンコードしないとき、それはUTF-8に既にあるので、この方法objReq.content.decode(encodes).encode("utf-8")を使用してUTF-8にエンコーディングを変換しようとしています)áこれに変更Ã

すべてのタイプのエンコードをUTF-8に変換する方法はありますか?

答えて

3

要求はISO-8859-1response.encoding属性を設定します。

Encoding section of the Advanced documentationを参照してください:

明示的な文字セットがContent-Typeヘッダがtextが含まれているHTTPヘッダに存在しない場合の要求はこれをしないだけの時間があります。 この状況では、RFC 2616では、デフォルトの文字セットはISO-8859-1である必要があります。この場合、要求は仕様に従います。別のエンコーディングが必要な場合は、Response.encodingプロパティを手動で設定するか、生のResponse.contentを使用します。

太字強調。

あなたはContent-Typeヘッダにcharsetパラメータを探して、このためにテストすることができます。

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">

recode HTMLページに異なるコーデックのヘッダーが含まれている場合は、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は、<?xml encoding="..." ... ?> XML宣言で指定されていない限り、常にUTF-8です。これはドキュメントの一部です。

+0

ありがとう、それは非常に有益だった:)。 – The6thSense

+0

与えられたスニペットは 'URL'の' None'型エラーを生成します。例えば、 'http://www.uraniumenergy.com/contact_us/contact_information 'のように、これがなぜ発生するのか、回避する方法を教えてください。 – The6thSense

+0

@ The6thense:考えていない。私はそれを試しても何のエラーもありません。トレースバックはありますか? –

2

要求は最初のHTTPヘッダにエンコーディングをチェックします:

print obj.headers['content-type'] 

出力:

text/html 

が正しくエンコードの推測の種類を解析しませんので、それはデフォルトのISO-8859-1を指定します。

詳しくはdocsを参照してください。あなたがtext/*応答を持っているし、何のコンテンツタイプはレスポンスヘッダで指定されていないとき

+0

ありがとうございました:)。 – The6thSense

関連する問題