2017-10-12 11 views
1

ここでは、問題のコードUnicodeEncodeErrorを: 'ASCII' コーデックはuが文字エンコードすることができない位置30339における 'をu2019 ':しない範囲で順序(128)

あるプログラム

session = requests.Session() 

セッションハンドラを開始SAMLアサーションは、取得する初期のIdPのURLを開き、リダイレクトHTTP302のすべてを、次の、そして得られたログインページを取得します

formresponse = session.get(idpentryurl, verify=sslverification) 

Fiがある、idpauthformsubmiturlをキャプチャ

:フォームの全ての辞書を構築するためにすべて302S

idpauthformsubmiturl = formresponse.url 

応答を解析し、必要なすべての値を抽出した後、最終URLは、IDPは

formsoup = BeautifulSoup(formresponse.text.decode('utf8')) 
payload = {} 

デバッグ出力を期待値次のようなトリックをしようと

DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): myapps.microsoft.com 
DEBUG:urllib3.connectionpool:https: //myapps.microsoft.com:443 "GET /signin/AWS%20CMD%20(Audit)/18216d2a-eef8-4fde-962c-50cf615f3f5b HTTP/1.1" 302 244 
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): account.activedirectory.windowsazure.com 
DEBUG:urllib3.connectionpool:https://account.activedirectory.windowsazure.com:443 "GET /applications/signin/AWS%20CMD%20(Audit)/18216d2a-eef8-4fde-962c-50cf615f3f5b HTTP/1.1" 302 94 
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): login.microsoftonline.com 
DEBUG:urllib3.connectionpool:https://login.microsoftonline.com:443 "GET /common/oauth2/authorize?client_id=0000000c-0000-0000-c000-000000000000&redirect_uri=https%3A%2F%2Faccount.activedirectory.windowsazure.com%2F&response_mode=form_post&response_type=code%20id_token&scope=openid%20profile&state=OpenIdConnect.AuthenticationProperties%3DmIDzRLZskQlxxtgB9rjxiHrNVmQJpcUVaK8wuZ3A2PMIyBE8fzxkXDcroNhC4wyof9OK9OlhqH0J_stoYSEIhKiEzx4O3XDW4rS4xyFTitGmztuV3ozOJhX5uafmQm_XmKnXEjEt9CNwFbp2Kju3rRGLAXRViD3byQ7XpwdXkeXoDFLwmy5OIXQgzvPjSsc7Jx7xEXMHckDwElhBOBFXmJVYCkHYx6cB-3yjwGJHX6RQ2lfx6CUg7x2PqPkbo4WsUxbZDAJZsMqYXyVRZGSDqAgU3gSezlHNgZGh-nblkxj7Dw6rdMVKmpNWZWkjp3zI3OjWa91FTrVc0mC9gIQC-BC4zaF-FrwQ4rHPbQlisQoS6-S1qM8ca_cEi6CfFaHh2lrtB-xdNEVum97Mzmlg9g&nonce=1507770263.sCv6L2a21eQuLNKaXL3zog&nux=1 HTTP/1.1" 200 15838 
Traceback (most recent call last): 
    File "formauth.py", line 62, in <module> 

formsoup = BeautifulSoup(formresponse.text.decode('utf8')) 

    File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 

**UnicodeEncodeError:** 'ascii' codec can't encode character u'\u2019' in position 30342: ordinal not in range(128) 

は助けにはならなかった:レスポンスボディにスペース

と非UTF8文字を置き換えます
formresponse.encoding = formresponse.apparent_encoding 
formsoupba = bytearray(formresponse.text, 'utf8') 
for i, val in enumerate(formsoupba): 
    if val > 128: 
     formsoupba[i] = 32 
     formsoup = BeautifulSoup(formsoupba.decode('utf8'), "html.parser") 

は、次のエラーを得られます:

リターンcodecs.utf_8_decode(入力、エラー、真) UnicodeDecodeError: 'UTF8' コーデックは、位置30334でバイトは0x80をデコードすることはできません:無効な開始バイト

任意のヘルプが評価されます

答えて

4

ユニコード文字(\u2019、引用符)をutf-8にデコードしようとしていますが、正常に動作するはずです。 何かがasciiにエンコードしようとしています - おそらくいくつかのbs4パーサー?

clean_text = formresponse.text.encode('utf8').decode('ascii', 'ignore') 
formsoup = BeautifulSoup(clean_text, "html.parser") 

これは単にignoreの任意のエンコーディングエラー、つまりあなたは文字を失う: -

それは問題ではありませんが、あなたが奇数文字を失うために喜んでいる場合は、ここに散弾銃のアプローチです。 https://login.microsoftonline.com:443<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">であると主張するが、それはのこれらの種類が含まれている場合、明らかにそうではありません - 深アプローチでよりは、ページの実際のエンコーディングを見つけることであろうhttps://docs.python.org/2/library/codecs.html

:無視を超えたいくつかの他のオプションについては、ここでドキュメントをチェックアウトchars。これがBeautifulSoupを投げ捨てているかもしれないと思います。 bs4にcp1252latin-1のようないくつかの異なるエンコーディングを与えてみてください。

+1

あなたのショットガンの回避策によってエラーメッセージが修正されました。一方で、私は今やドロップされたキャラクターに関連しているかもしれないし、そうでないかもしれない新しいエラーを得ています:)なぜ私は "レスポンスに有効なSAMLアサーションが含まれていないのか"を知る必要があると思います。いずれにしても、修正のおかげで – gbaz

関連する問題