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

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

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

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

解決済

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

BITO
BITO

総合スコア19

Python 3.x

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

1回答

0評価

1クリップ

3423閲覧

投稿2018/05/04 13:08

編集2018/05/10 15:44

前提・実現したいこと

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

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

Python

#!C:\Program Files\WinPython\python-3.6.5.amd64\python.exe # -*- coding: utf-8 -*- import requests url = 'http://yahoo.com/' 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)

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

出力結果

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"))
とすると変換できない文字は無視するので、何かしら表示できるようになりますが、無視して良いものかどうかは私には判断できません。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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なので、たぶん大丈夫だとは思うのですが・・・

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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