質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

5615閲覧

Python requestsで、取り込んだHTMLが全文が出力されません。

BITO

総合スコア19

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/05/04 13:08

編集2018/05/10 15:44

前提・実現したいこと

昨日pythonをはじめましたが、
import requestsがうまくいきません。
改善点を指摘お願いします。

以下のようなコードを書き、YahooのHTMLを出力しようとしています。

Python

1#!C:\Program Files\WinPython\python-3.6.5.amd64\python.exe 2# -*- coding: utf-8 -*- 3 4import requests 5 6url = 'http://yahoo.com/' 7 8print("Content-Type: text/plain;charset=utf-8\n\n") 9 10r = requests.get(url) 11 12print(r.status_code) 13 14print(r.headers['content-type']) 15 16print(r.encoding) 17 18print(r.text) 19 20print(r.json()) 21 22print(r.content) 23

発生している問題・エラーメッセージ

出力結果

200 text/html; charset=UTF-8 UTF-8

###やってみたこと

#!C:\Program Files\WinPython\python-3.6.5.amd64\python.exe # -*- coding: utf-8 -*- import requests url = 'http://yahoo.com/' try: print("Content-Type: text/plain;charset=utf-8\n\n") r = requests.get(url) print(r.status_code) print(r.headers['content-type']) print(r.encoding) print(r.text) print(r.json()) print(r.content) except Exception as e: print '=== エラー内容 ===' print 'type:' + str(type(e)) print 'args:' + str(e.args) print 'message:' + e.message print 'e自身:' + str(e) print '処理終了'

500 error
サーバ内部で障害が発生し、 リクエストに応えることができませんでした。
Error message:
End of script output before headers: test.py

補足情報(FW/ツールのバージョンなど)

・python-3.6.5.amd64
http://localhost:8020 ルートディレクトリで実行
・XAMPPで実行

Twitterでいただいた情報

マイPCに同じ環境を作って試してみました。どうもprint文で文字列をブラウザに出力する際、特定の文字?が含まれていると出力されないようですね。「r.text」を「r.text[0:77342]」のようにして、77342文字目まで出力するようにしたら、出ました。

同様に記述したところ、確かに出力されました。「»」という文字にひっかかるまでは…

Twitterでいただいた情報2

こちらの環境で例外を補足してみたところ、

'cp932' codec can't encode character '\xbb' in position 79453: illegal multibyte sequence
というエラーが確認されました。
軽く調べてみた感じ、Windows環境ではprintの際に内部で自動的に「CP932」というコードへ変換されるらしく、
その際に変換できない文字が含まれていると例外が発生するようです。
とりあえず
print(r.text.encode('cp932', "ignore").decode('utf-8', "ignore"))
とすると変換できない文字は無視するので、何かしら表示できるようになりますが、無視して良いものかどうかは私には判断できません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umyu

2018/05/04 13:46

発生している例外メッセージを質問文に追記してくださいな。
BITO

2018/05/04 14:00 編集

"例外メッセージ"自体がまだわかっていないのですが、当該箇所を try: ~ except させると500エラーになります。
umyu

2018/05/04 14:05

サーバー経由せずに、手元の環境でPythonスクリプトを実行すると分かるのですが、r.json()の行でJSON形式データに変換しようとしてエラーになってます。
umyu

2018/05/04 14:06

で、このスクリプトはサーバー経由で動作させたいという認識でよいでしょうか?
BITO

2018/05/04 14:12

pythonでスクレイピングを行うにあたり、どのような動作をするかを確認するために記述しているので、とりあえず手元の環境で動かしているという感じです。サーバー経由とローカルのみで異なる結果になるという点は、今はじめて認識しました。
BITO

2018/05/04 14:22

print (r.json()) 以下、コメントアウトしましたが、出力結果は変わりませんでした。
umyu

2018/05/04 14:35

そういう話でしたら、これをいれてみてはどうでしょうか?r.textの前の行にr.encoding = r.apparent_encoding
BITO

2018/05/04 14:41

試してみましたが、出力結果これまでと同様でした。
umyu

2018/05/04 14:42

お役にたてなくて、申し訳ないですー。
BITO

2018/05/04 14:43

お手数をおかけしました。ありがとうございます。
tachikoma

2018/05/04 15:05 編集

このスクリプト、どういう環境で実行してます?コマンドプロンプト?
tachikoma

2018/05/04 15:07

xamppか・・・うーん触ったことないから自身ないのですが、出力側の文字コードがsjisになっててutf8のデコーディングエラーが発生して表示できなくなっている、というのはないですかね。
BITO

2018/05/04 15:59 編集

ファイル自体のエンコードは、utf-8です。取り込み先も、出力 もutf-8なので、たぶん大丈夫だとは思うのですが・・・
guest

回答1

0

自己解決

Twitterでいただいた情報をもとに…

Python

1#この記述を… 2print(r.text) 3 4#このような記述に書き換えると… 5print(r.text.encode('cp932', "ignore").decode('utf-8', "ignore"))

全文取得できました!

Windows環境ではprintの際に内部で
自動的に「CP932」というコードへ変換されるとのことでした…。

ただし、引っかかっていた文字列「»」は消えたようです。

参考 - (Windows) Python3でのUnicodeEncodeErrorの原因と回避方法
https://qiita.com/butada/items/33db39ced989c2ebf644

追記

冒頭に

Python

1import io,sys 2sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 3sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

と入れて…

Python

1print(r.text)

…とすると…
「»」も含めて出力することに成功しました!

投稿2018/05/10 15:43

編集2018/05/10 15:58
BITO

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問