###前提・実現したいこと
以下のサイトにJANコードの値を入力して、検索結果のASINコードをスクレイピングして表示することを実行しようとしています。
検索窓に入力するWebサイト
###発生している問題・エラーメッセージ
以下のコードを実行するとこのようなエラーが表示されており、修正のためのアドバイスをいただけますと幸いです。
$ python trial.py --jan 4901351055618 File "trial.py", line 30 for k,v in products.iteritems(): ^ IndentationError: expected an indented block
###該当のソースコード
python
1#trial.py 2
###補足情報(言語/FW/ツール等のバージョンなど)
Python 2.7.12
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
IndentationError: expected an indented block
と書いてありますね。
こう書いてあるんですから、『インデントがおかしいのかな?』とまず疑ってください。
Python
for a in args.jan:
for k,v in products.iteritems():
投稿2018/01/09 10:40
編集2018/01/09 10:42総合スコア35660
0
Python
1 products = {} 2 for a in args.jan: 3 for k,v in products.iteritems():
このコードproductsが空ですが論理的に破綻してませんか?
mainメソッドで複数の処理を行うのではなくメソッドを分けてくださいな。
0. コマンドライン引数で渡されたJanコードをlistとして返す。
0. 引数で渡されたlistを元にスクレイピングを行い結果を返す。
0. 2の結果を表示する。
質問文のコードを改造しました。ご参考まで.
Pyhon
1# -*- coding: utf-8 -*- 2from selenium import webdriver 3from selenium.common.exceptions import NoSuchElementException 4import argparse 5import codecs 6import sys 7from contextlib import closing 8import pprint 9 10sys.stdout = codecs.getwriter('utf_8')(sys.stdout) 11sys.stdin = codecs.getreader('utf_8')(sys.stdin) 12 13 14class Scraper: 15 def __init__(self): 16 self.target_url = "https://antlion.xsrv.jp/" 17 self.driver = webdriver.PhantomJS() 18 self.DELAY_SLEEP = 1 # sec 19 20 def close(self): 21 if self.driver is not None: 22 self.driver.close() 23 self.driver = None 24 25 def scrap(self, jan): 26 v = {'jan': jan} 27 try: 28 self.driver.implicitly_wait(self.DELAY_SLEEP) 29 # JAN code 30 self.driver.get(self.target_url) 31 self.driver.implicitly_wait(self.DELAY_SLEEP) 32 elem = self.driver.find_element_by_xpath('//*[@id="content"]/div[1]/div/form/input[2]') 33 elem.send_keys(jan) 34 elem = self.driver.find_element_by_xpath('//*[@id="content"]/div[1]/div/form/input[3]') 35 elem.click() 36 elems = self.driver.find_elements_by_xpath('//*[@id="content"]/div[2]/div[5]/ul/li') 37 for e in elems: 38 desc = e.get_attribute('textContent') 39 if desc.startswith("ASIN"): 40 v['asin'] = desc.split()[-1] 41 except NoSuchElementException: 42 print("not available") 43 except Exception as e: 44 print(e) 45 46 return v 47 48 49def get_input(debug=True): 50 if debug: 51 class MimicArgs: 52 def __init__(self): 53 self.jan = ['9781449355739', '9784873117584', '9784873112992'] 54 return MimicArgs() 55 parser = argparse.ArgumentParser(description='Get asin from JANJAN_URL') 56 parser.add_argument('--jan', nargs='+') 57 return parser.parse_args() 58 59 60def main(): 61 args = get_input() 62 pp = pprint.PrettyPrinter() 63 with closing(Scraper()) as sc: 64 for jan in args.jan: 65 products = sc.scrap(jan) 66 pp.pprint(products) 67 68 69if __name__ == "__main__": 70 main() 71
■謝辞
mkgrei様の回答文のソースコードを参考に致しました。
素晴らしいソースコードありがとうございます。
投稿2018/01/09 10:58
編集2018/01/09 13:16総合スコア5846
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
おそらく書きたいのは以下のものではないでしょうか。
python
1products = {} 2for a in args.jan: 3 products[a] = {} 4 v = products[a]
Selenium.webdriverにバグがあってJANコードがあってもたまに取得にミスるみたいですね。
python
1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3from selenium import webdriver 4from selenium.common.exceptions import NoSuchElementException 5from selenium.webdriver.common.keys import Keys 6import argparse 7 8DELAY_SLEEP = 1 9JANJAN_URL = "https://antlion.xsrv.jp/" 10 11def get_input(fmimic=True): 12 if fmimic: 13 class MimicArgs: 14 def __init__(self): 15 self.jan = [4976219091275, 4873116953, 4873116950000] 16 args = MimicArgs() 17 else: 18 parser = argparse.ArgumentParser(description='Get asin from JANJAN_URL') 19 parser.add_argument('--jan', nargs='+') 20 args = parser.parse_args() 21 return args 22 23def main(): 24 args = get_input() 25 26 driver = webdriver.Chrome() 27 28 products = {} 29 for jan in args.jan: 30 try: 31 driver.get(JANJAN_URL) 32 jan_input_box = driver.find_element_by_xpath('//*[@id="content"]/div[1]/div/form/input[2]') 33 jan_input_box.send_keys(jan) 34 jan_input_button = driver.find_element_by_xpath('//*[@id="content"]/div[1]/div/form/input[3]') 35 jan_input_button.click() 36 37 content = driver.find_elements_by_xpath('//*[@id="content"]/div[2]/div[5]/ul/li') 38 if len(content) == 0: 39 raise NoSuchElementException 40 asin = None 41 for e in content: 42 desc = e.get_attribute('textContent') 43 if desc.startswith("ASIN"): 44 asin = desc.split()[-1] 45 if asin is None: 46 print('ASIN not found') 47 title = driver.find_elements_by_xpath('//*[@id="content"]/div[2]/div[3]/h3/a')[0].text 48 except NoSuchElementException: 49 print("not available") 50 print(jan) 51 continue 52 products[title] = {} 53 v = products[title] 54 v['ASIN'] = asin 55 v['JAN'] = jan 56 57 for k, v in products.items(): 58 print(k, v) 59 driver.close() 60 61if __name__ == "__main__": 62 main()
投稿2018/01/09 11:09
編集2018/01/09 11:51総合スコア8560
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/01/09 12:06
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/01/09 12:06