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

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

ただいまの
回答率

89.98%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,134

BITO

score 17

 前提・実現したいこと

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

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

#!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文字目まで出力するようにしたら、出ました。
https://twitter.com/koma_neko/status/992409734496927744

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tachikoma

    2018/05/05 00:04 編集

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

    キャンセル

  • tachikoma

    2018/05/05 00:07

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

    キャンセル

  • BITO

    2018/05/05 00:59 編集

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

    キャンセル

回答 1

check解決した方法

0

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

#この記述を…
print(r.text)

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


全文取得できました!

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

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

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

 追記

冒頭に

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

と入れて…

print(r.text)


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる