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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 2.7

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

Webサイト

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

XPath(XML Path)

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

selenium

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

Q&A

解決済

3回答

1554閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 2.7

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

Webサイト

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

XPath(XML Path)

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

selenium

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

0グッド

0クリップ

投稿2018/01/09 10:37

編集2018/01/09 21:59

###前提・実現したいこと
以下のサイトに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ページで確認できます。

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

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

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

guest

回答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
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2018/01/09 12:06

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

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
umyu

総合スコア5846

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

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

退会済みユーザー

退会済みユーザー

2018/01/09 12:06

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

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
mkgrei

総合スコア8560

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

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

退会済みユーザー

退会済みユーザー

2018/01/09 12:06

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問