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

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

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

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

Q&A

解決済

3回答

4110閲覧

pythonでhtmlを取得することについて

berry

総合スコア60

Python 3.x

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

0グッド

0クリップ

投稿2016/01/03 16:04

python3でwebのhtmlを取得したいのですが

import urllib.request
response = urllib.request.urlopen('http://google.co.jp')
content = response.read()
content

このコードを実行すると確かに、htmlは
取得できるのですが
b'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="\x90\xa2\x8aE\x92\x86\x82\xcc\x82\xa0\x82\xe7\x82\xe4\x82\xe9\x8f\xee\x95\xf1\x82\xf0\x8c\x9f\x8d\xf5\x82\xb7\x82\xe9\x82\xbd\x82\xdf\x82\xcc\x83c\x81[\x83\x8b\x82\xf0\x92\xf1\x8b\x9f\x82\xb5\x82\xc4\x82\xa2\x82\xdc\x82\xb7\x81B\x82\xb3\x82\xdc\x82\xb4\x82\xdc\x82\xc8\x8c\x9f\x8d\xf5\x8b@\x94\\x82\xf0\x8a\x88\x97p\x82\xb5\x82\xc4\x81A\x82\xa8\x92T\x82\xb5\x82\xcc\x8f\xee\x95\xf1\x82\xf0\x8c\xa9\x82\xc2\x82\xaf\x82\xc4\x82\xad\x82\xbe\x82\xb3\x82\xa2\x81B"(一部抜粋)
となり、ブラウザー上でページのソースを表示の際と日本語の部分が異なってきます。どうすれば、良いでしょうか。回答の程よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

まず、認識を改めていただくため下記3行はご認識いただけますか。
既に存じ上げていましたら結構です。

  • 紙の表現とは違い、PC上でブラウザで見たときやテキストを開いたときなどの表現のされ方は、

見た目で書かれているのとは違いPCで一度何かしらの実行解釈がされた結果である。

  • ブラウザは人に優しいために、URLが間違っていても、書いてあるhtmlが間違っても一見正しく解釈され表示されます。
  • コードは書いたとおりに動くので、親切ではない

今回の事例では、書いたコードが正しく動いたのですね。日本語表現はされませんが。

以下1つが必要です。

  • 表示された文字列の日本語化(テキストエンコーディングとも言いますが)

ひょっとしたらブラウザで見ているエンコードとは異なるかもしれません。

python

1import urllib.request 2response = urllib.request.urlopen('http://google.co.jp') 3content = response.read().decode('shift-jis') 4print(content)

投稿2016/01/04 02:30

lib

総合スコア446

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

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

berry

2016/01/04 09:18

解答、ありがとうございました。また、その他にも解答を頂いた方も大変参考になりました。
guest

0

基本的にlibさんの指摘どおりだと思います。

Python3.xに関して、strとbytesが明確に分かれましたのでエンコーディングを意識する必要があります(それまではdefaultcodingsystemの値によってなんとなく動いちゃってた過去があります)。urllibではurlにあるリソースにアクセスする方法を提供するだけで、そのリソースが画像なのかテキストなのかは感知しません。WebブラウザはHTTPヘッダやmetaタグで指定されたエンコーディングを頼りにデコードしています。スクリプトでWeb上のHTMLを取得する場合は同様のことを自前でやる必要があります。

なお、エンコーディングを解析したりするのがめんどくさい、あるいはエンコーディングが指定されてないコンテンツを扱う場合は、chardetというパッケージにエンコーディングを統計的に類推させることもできます。

投稿2016/01/04 09:09

sharow

総合スコア1149

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

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

0

レスポンスコードが200以外ではないですか?

追記
確認したところ、私の環境ではレスポンスコードは200だったので、libさんの仰る文字コードの認識違いのようですね。

投稿2016/01/04 01:33

編集2016/01/04 02:44
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問