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

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

ただいまの
回答率

90.84%

  • Python 2.7

    1170questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • Webサイト

    984questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • selenium

    425questions

    Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

  • スクレイピング

    261questions

  • XPath(XML Path)

    67questions

    XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

Pythonでウェブサイトの検索窓に入力し結果を取ってくるコードのfor文に関するエラー

解決済

回答 3

投稿 編集

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

harunouta

score 62

前提・実現したいこと

以下のサイトにJANコードの値を入力して、検索結果のASINコードをスクレイピングして表示することを実行しようとしています。
検索窓に入力するWebサイト

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

以下のコードを実行するとこのようなエラーが表示されており、修正のためのアドバイスをいただけますと幸いです。

$ python trial.py --jan 4901351055618
  File "trial.py", line 30
    for k,v in products.iteritems():
      ^
IndentationError: expected an indented block

該当のソースコード

#trial.py

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

Python 2.7.12

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+5

IndentationError: expected an indented blockと書いてありますね。
こう書いてあるんですから、『インデントがおかしいのかな?』とまず疑ってください。

for a in args.jan:
for k,v in products.iteritems():

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/09 21:06

    ご回答いただきましてありがとうございます。

    キャンセル

+3

    products = {}
    for a in args.jan:
    for k,v in products.iteritems():


このコードproductsが空ですが論理的に破綻してませんか?

mainメソッドで複数の処理を行うのではなくメソッドを分けてくださいな。

  1. コマンドライン引数で渡されたJanコードをlistとして返す。
  2. 引数で渡されたlistを元にスクレイピングを行い結果を返す。
  3. 2の結果を表示する。

質問文のコードを改造しました。ご参考まで.

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import argparse
import codecs
import sys
from contextlib import closing
import pprint

sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
sys.stdin = codecs.getreader('utf_8')(sys.stdin)


class Scraper:
    def __init__(self):
        self.target_url = "https://antlion.xsrv.jp/"
        self.driver = webdriver.PhantomJS()
        self.DELAY_SLEEP = 1  # sec

    def close(self):
        if self.driver is not None:
            self.driver.close()
            self.driver = None

    def scrap(self, jan):
        v = {'jan': jan}
        try:
            self.driver.implicitly_wait(self.DELAY_SLEEP)
            # JAN code
            self.driver.get(self.target_url)
            self.driver.implicitly_wait(self.DELAY_SLEEP)
            elem = self.driver.find_element_by_xpath('//*[@id="content"]/div[1]/div/form/input[2]')
            elem.send_keys(jan)
            elem = self.driver.find_element_by_xpath('//*[@id="content"]/div[1]/div/form/input[3]')
            elem.click()
            elems = self.driver.find_elements_by_xpath('//*[@id="content"]/div[2]/div[5]/ul/li')
            for e in elems:
                desc = e.get_attribute('textContent')
                if desc.startswith("ASIN"):
                    v['asin'] = desc.split()[-1]
        except NoSuchElementException:
            print("not available")
        except Exception as e:
            print(e)

        return v


def get_input(debug=True):
    if debug:
        class MimicArgs:
            def __init__(self):
                self.jan = ['9781449355739', '9784873117584', '9784873112992']
        return MimicArgs()
    parser = argparse.ArgumentParser(description='Get asin from JANJAN_URL')
    parser.add_argument('--jan', nargs='+')
    return parser.parse_args()


def main():
    args = get_input()
    pp = pprint.PrettyPrinter()
    with closing(Scraper()) as sc:
        for jan in args.jan:
            products = sc.scrap(jan)
            pp.pprint(products)


if __name__ == "__main__":
    main()

■謝辞
mkgrei様の回答文のソースコードを参考に致しました。
素晴らしいソースコードありがとうございます。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/09 21:06

    ご回答いただきましてありがとうございます。

    キャンセル

checkベストアンサー

+2

おそらく書きたいのは以下のものではないでしょうか。

products = {}
for a in args.jan:
    products[a] = {}
    v = products[a]

Selenium.webdriverにバグがあってJANコードがあってもたまに取得にミスるみたいですね。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import argparse

DELAY_SLEEP = 1
JANJAN_URL = "https://antlion.xsrv.jp/"

def get_input(fmimic=True):
    if fmimic:
        class MimicArgs:
            def __init__(self):
                self.jan = [4976219091275, 4873116953, 4873116950000]
        args = MimicArgs()
    else:
        parser = argparse.ArgumentParser(description='Get asin from JANJAN_URL')
        parser.add_argument('--jan', nargs='+')
        args = parser.parse_args()
    return args

def main():
    args = get_input()

    driver = webdriver.Chrome()

    products = {}
    for jan in args.jan:
        try:
            driver.get(JANJAN_URL)
            jan_input_box = driver.find_element_by_xpath('//*[@id="content"]/div[1]/div/form/input[2]')
            jan_input_box.send_keys(jan)
            jan_input_button = driver.find_element_by_xpath('//*[@id="content"]/div[1]/div/form/input[3]')
            jan_input_button.click()

            content = driver.find_elements_by_xpath('//*[@id="content"]/div[2]/div[5]/ul/li')
            if len(content) == 0:
                raise NoSuchElementException
            asin = None
            for e in content:
                desc = e.get_attribute('textContent')
                if desc.startswith("ASIN"):
                    asin = desc.split()[-1]
            if asin is None:
                print('ASIN not found')
            title = driver.find_elements_by_xpath('//*[@id="content"]/div[2]/div[3]/h3/a')[0].text
        except NoSuchElementException:
            print("not available")
            print(jan)
            continue
        products[title] = {}
        v = products[title]
        v['ASIN'] = asin
        v['JAN'] = jan

    for k, v in products.items():
        print(k, v)
    driver.close()

if __name__ == "__main__":
    main()

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/09 21:06

    何度もご回答いただきましてありがとうございました。大変助かりました。
    Selenium.webdriverのバグについてもご明記いただきましてありがとうございます。

    キャンセル

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

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

関連した質問

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

  • Python 2.7

    1170questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • Webサイト

    984questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • selenium

    425questions

    Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

  • スクレイピング

    261questions

  • XPath(XML Path)

    67questions

    XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。