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

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

ただいまの
回答率

90.52%

  • Python 3.x

    6342questions

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

pythonでURL先の情報を読み取りたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 222

ssh_u

score 16

 前提・実現したいこと

pythonでURL先の情報をjson形式で読み込みたい

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

urllib.error.HTTPError: HTTP Error 400: Bad Request
エラー箇所はコメントアウトで指示してます

 該当のソースコード

# -*- coding: utf-8 -*-
import json
import urllib.request
import urllib.parse

API_KEY = 'APIKEY'
CUSTOM_SEARCH_ENGINE_ID = 'ID'
SEARCH_WORDS = 'dog'  # 検索ワード

NUM = 10

url = 'https://www.googleapis.com/customsearch/v1?key={API_KEY}&cx={CUSTOM_SEARCH_ENGINE_ID}&q={SEARCH_WORD}'

f = open('googleresult.json', 'w')

for i in range(0, NUM):

    req = urllib.request.Request(url) 

    response = urllib.request.urlopen(req)
    #↑ここで上のエラーが出ます
    content = json.loads(response.read().decode('utf8'))

    f.write(json.dump(content))

f.close()

 試したこと

エラーを解決したです

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

説明不足かもしれませんがよろしくお願いします

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

fプレフィックスをお忘れでは。

url = 'https://www.googleapis.com/customsearch/v1?key={API_KEY}&cx={CUSTOM_SEARCH_ENGINE_ID}&q={SEARCH_WORD}'

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

url = f'https://www.googleapis.com/customsearch/v1?key={API_KEY}&cx={CUSTOM_SEARCH_ENGINE_ID}&q={SEARCH_WORD}'

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/28 21:00

    コメントありがとうございます

    NameError: name 'SEARCH_WORD' is not defined

    新しいエラーが出てきました

    キャンセル

  • 2018/06/28 21:03

    エラーメッセージに書いてあるとおりです。
    本当に『SEARCH_WORD』を宣言しているか、良く見てみてください。

    キャンセル

  • 2018/06/28 21:04

    すみません自分のミスでした

    f.write(json.dump(content))

    TypeError: dump() missing 1 required positional argument: 'fp'

    治したらまた新しいエラーが出ました
    何度もすみません

    キャンセル

  • 2018/06/28 21:05

    json.dump ⇒ json.dumps

    キャンセル

  • 2018/06/28 21:07 編集

    ありがとうございます!
    できました

    すみません質問がひとつあります

    SEARCH_WORD = 'dog'
    のとこが検索ワードなんですが、ここを「犬」とすると文字化けして、検索できません。
    どうしたらよいでしょうか?

    キャンセル

  • 2018/06/28 21:31

    気づいていられるか確認のコメントです。
    しつこくてすみません

    キャンセル

  • 2018/06/28 21:36

    少々お待ちください。

    キャンセル

  • 2018/06/28 21:41

    >shunmameさんへ
    urllib.request.urlopenは日本語クエリに対応するのが面倒なので、requests パッケージを使用することをお勧めします。
    https://teratail.com/questions/110327

    キャンセル

  • 2018/06/28 21:47 編集

    @umyu さん
    情報提供ありがとうございます。

    ---
    @shunmame さん
    いちおうこんな感じでゴリゴリ検索することは可能です。

    ---
    def encode_search_word(word):
    __return ''.join(
    ____map(lambda v: '%{:X}'.format(v), word.encode('utf-8'))
    __)

    SEARCH_WORD = encode_search_word('いぬ')

    註:空白をアンダースコアで代替しています。
    ---

    しかし最初から対応しているパッケージを使うに越したことはないので、umyuさんの紹介されているrequestsパッケージの利用を私も推奨します。

    キャンセル

  • 2018/06/28 21:50

    お二方詳しく説明していただきありがとうございます

    今後もpythonライフを頑張ていきます

    キャンセル

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

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

関連した質問

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

  • Python 3.x

    6342questions

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