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

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

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

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

selenium

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

Q&A

解決済

2回答

542閲覧

Pythonとseleniumを用いて、検索結果を取得する。

RarigoB

総合スコア26

Python 3.x

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

selenium

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

0グッド

0クリップ

投稿2018/03/08 16:39

https://torina.top/detail/318/
上記のサイトを参考に、googleの検索結果を取得しようとしたですが、解消できないエラーに遭遇しました。

Python

1from collections import namedtuple 2import time 3from selenium import webdriver 4from selenium.common.exceptions import NoSuchElementException 5from selenium.webdriver.common.keys import Keys 6 7SearchResultRow = namedtuple( 8'SearchResultRow', 9['title', 'ul', 'display_url', 'dis'] 10) 11 12AdResultRow = namedtuple( 13'AdResultRow', 14['title', 'ul', 'display_url', 'dis1', 'dis2', 'dis3'] 15) 16 17RelationResultRow = namedtuple( 18'RelationResultRow', 19['word', 'url'] 20) 21 22def get_text_or_none(element, num): 23 24 for row in driver.find_elements_by_css_selector('div.spam'): 25 a_element = row.find_elements_by_tag_name('a') 26 a1 = get_elements_of_one(a_element, 0) 27 a2 = get_elements_of_one(a_element, 1) 28 a3 = get_elements_of_one(a_element, 2) 29 30 try: 31 return element[num].text 32 except IndexError: 33 return '' 34 35class GoogleScrapy: 36 37 def __init__(self, keyword, end = 1, default_wait=5): 38 self.url = 'https://www.google.co.jp?pws=0' 39 self.keyword = keyword 40 self.end = end 41 self.default_wait = default_wait 42 self.driver = webdriver.Firefox() 43 self.searches = [[] for x in range(end)] 44 self.ads = [[] for x in range(end)] 45 self.relations = [[] for x in range(end)] 46 47 def enter_keyword(self): 48 self.driver.get(self.url) 49 self.driver.find_element_by_id('lst-ib').send_keys(self.keyword) 50 self.driver.find_element_by_id('lst-ib').send_keys(Keys.RETURN) 51 52 def next_page(self): 53 54 self.driver.find_elements_by_css_selector('a#pnnext').click() 55 time.sleep(self.default_wait) 56 57 def get_search(self, page): 58 59 all_search = self.driver.find_element_by_class_name('rc') 60 for data in all_search: 61 title = data.find_element_by_tag_name('h3').text 62 url = data.find_elements_by_css_selector('h3 > a').get_attribute('href') 63 display_url = data.find_element_by_tag_name('cite').text 64 try: 65 dis = data.find_element_by_class_name('st').text 66 except NoSuchElementException: 67 dis = '' 68 69 result = SearchResultRow(title, url, display_url, dis) 70 self.searches[page].append(result) 71 72 def get_ad(self, page): 73 74 all_abs = self.driver.find_element_by_class_name('ads-ad') 75 for abs in all_abs: 76 title = abs.find_element_by_tag_name('h3').text 77 url = abs.find_elements_by_css_selector('h3 > a')[1].get_attribute('href') 78 display_url = abs.find_element_by_tag_name('cite').text 79 80 dis_element = abs.find_element_by_class_name('ellip') 81 dis1 = get_text_or_none(dis.element, 0) 82 dis2 = get_text_or_none(dis.element, 1) 83 dis3 = get_text_or_none(dis.element, 2) 84 result = AdResultRow(title, url, display_url, dis1, dis2, dis3) 85 self.abs[page].append(result) 86 87 def get_relation(self, page): 88 all_relation = self.driver.find_elements_by_css_selector('p._e4b > a') 89 for relation in all_relation: 90 word = relation.text 91 url = relation.get_attribute('href') 92 result = RelationResultRow(word, url) 93 self.relations[page].append(result) 94 95 def start(self): 96 try: 97 self.driver = webdriver.Firefox() 98 self.driver.implicitly_wait(self.default_wait) 99 self.enter_keyword() 100 for page in range(self.end): 101 self.get_search(page) 102 self.get_ad(page) 103 self.get_relation(page) 104 self.next_page() 105 106 finally: 107 self.driver.quit() 108

Python

1from gscrapy import GoogleScrapy 2 3google = GoogleScrapy('プログラミング', end=3) 4google.start() 5 6print('検索結果 全ページ') 7print('-'*30) 8for page_num, row in enumerate(google.searches, 1): 9 print('-'*30) 10 print('{0}ページ目'.format(page_num)) 11 print('-'*30) 12 for row in rows: 13 print(row.title) 14 15print('-'*30) 16print('広告1ページのみ') 17print('-'*30) 18for row in google.abs[0]: 19 print(row.title) 20 21print('-'*30) 22print('関連キー3ページのみ') 23print('-'*30) 24for row in google.relations[2]: 25 print(row.word ) 26

エラーメッセージがこちらです。
Traceback (most recent call last):
File "main.py", line 4, in <module>
google.start()
File "/home/rarigo/snake_practice/gscrapy.py", line 101, in start
self.get_search(page)
File "/home/rarigo/snake_practice/gscrapy.py", line 60, in get_search
for data in all_search:
TypeError: 'FirefoxWebElement' object is not iterable

環境
Python3.5.2

このエラーの解消法を教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

いくつかタイプミスがあるようですね。mkgrei様がおっしゃっているように、

「element]と「elements」
「ads」と「abs(ミスタイプと思われます。dです。)」

に注意してください。
また、get_text_or_none関数の上側のコードはドックストリングという、プログラムの説明的な部分に含まれていたコードです。実際の処理は、以下の4行だけです。

python

1 try: 2 return element[num].text 3 except IndexError: 4 return ''

どうにもならなかったら、単純にコピーペーストをするほうが良いかもしれません。

投稿2018/03/09 22:26

編集2018/03/09 22:27
toritoritorina

総合スコア972

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

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

0

all_search = self.driver.find_elements_by_class_name('rc')だったりしませんか。

投稿2018/03/08 20:48

mkgrei

総合スコア8560

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問