🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

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

Q&A

解決済

2回答

12363閲覧

python×selenium for文によるループ処理でループしないのですが、なぜうまくいかないのでしょうか?

growthhackoji3

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

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

0グッド

0クリップ

投稿2019/11/01 17:41

編集2019/11/02 04:02

前提・実現したいこと

pythonでfor文によるループ処理をしたいのですが、ループせずに処理が止まってしまう状況です。
エラーは出ずに処理が停止する状況です

発生している問題個所

#IDを引き抜く USERID_PATH = '/html/body/div[3]/div[2]/div/article/header/div[2]/div[1]/div[1]/h2' userids=[] userid_lists = driver.find_elements_by_xpath(USERID_PATH) for userid_list in userid_lists: userid = userid_list.text userids.append(userid) print(userid) time.sleep(random.randint(3,8)) round_page = driver.find_element_by_css_selector(NEXT_PAGE_SELECTOR) round_page.click() time.sleep(random.randint(3,8))

やりたいこととしましては、まずuseridを取得後、NEXTPAGEに遷移して、またuseridを取得し、次のページへ遷移するという挙動をしたいです
上記コードにおける

round_page = driver.find_element_by_css_selector(NEXT_PAGE_SELECTOR)

ここまではたどり着くのですが、次のuseridを取得せずに止まってしまいます。
お力添え、よろしくお願いいたします。

コード全文

python

1from selenium import webdriver 2from selenium.webdriver.common.keys import Keys 3import urllib.parse 4import time 5import random 6 7#Webdriver 8driver = webdriver.Chrome("C:/Users/yutam/Downloads/chromedriver_win32/chromedriver.exe") 9 10#URL 11MAIN_URL = "https://www.XXXX.com/" 12TAG_SEARCH_URL = MAIN_URL + "explore/tags/{}/?hl=ja" 13 14#selectors 15LOGIN_PATH = '//*[@id="react-root"]/section/main/article/div[2]/div[2]/p/a' 16LIKE_PATH = "//button/span[@class='glyphsSpriteHeart__outline__24__grey_9 u-__7']" 17LIKE_BUTTON_PATH = "//button[@class='dCJp8 afkep _0mzm-']" 18 19MEDIA_SELECTOR = 'div._9AhH0' #表示されているメディアのwebelement 20NEXT_PAGE_SELECTOR = 'a.coreSpriteRightPaginationArrow' #次へボタン 21 22#USER INFO(ユーザ名とパスワードをここにいれてください。) 23username = "XXXXX" 24password = "XXXXXX" 25#params 26tagName = "海外旅行" 27 28 29if __name__ == '__main__': 30 31 #login 32 driver.get(MAIN_URL) 33 time.sleep(random.randint(2, 7)) 34 driver.find_element_by_xpath(LOGIN_PATH).click() 35 time.sleep(random.randint(2, 7)) 36 usernameField = driver.find_element_by_name('username') 37 usernameField.send_keys(username) 38 time.sleep(1) 39 passwordField = driver.find_element_by_name('password') 40 passwordField.send_keys(password) 41 time.sleep(random.randint(2, 7)) 42 passwordField.send_keys(Keys.RETURN) 43 44 time.sleep(random.randint(2, 7)) 45 46 #通知解除 47 notification_button = driver.find_element_by_class_name('HoLwm') 48 notification_button.click() 49 time.sleep(random.randint(2, 7)) 50 51 #tag search 52 53 encodedTag = urllib.parse.quote(tagName) #普通にURLに日本語は入れられないので、エンコードする 54 encodedURL = TAG_SEARCH_URL.format(encodedTag) 55 print("encodedURL:{}".format(encodedURL)) 56 driver.get(encodedURL) 57 58 #media click 59 time.sleep(random.randint(2, 7)) 60 driver.implicitly_wait(10) 61 driver.find_element_by_css_selector(MEDIA_SELECTOR).click() 62 time.sleep(random.randint(2, 7)) 63 64 #userid,like,URL,folowwers,followsを取得したい 65 #まずidとフォロワー取得 66 67 68 #NUM_LIKED_PATH = '//*[@id="react-root"]/section/main/div/div/article/div[2]/section[2]/div/div[2]/button/span' 69 70 #NUM_FOLLOWER_PATH = '//*[@id="react-root"]/section/main/div/header/section/ul/li[2]/a/span' 71 #NUM_FOLLOW_PATH = '//*[@id="react-root"]/section/main/div/header/section/ul/li[3]/a/span' 72 73 #liked_list = drive.find_element_by_xpath(NUM_LIKED_PATH) 74 #folower_list = drive.find_element_by_xpath(NUM_FOLLOWER_PATH) 75 #folow_list = drive.find_element_by_xpath(NUM_FOLLOW_PATH) 76 77 #ユーザIDだけ引き抜けるか実験 78 postCOUNTER=0 79 postMAX=5 80 81 82 83 #IDを引き抜く 84 USERID_PATH = '/html/body/div[3]/div[2]/div/article/header/div[2]/div[1]/div[1]/h2' 85 userids=[] 86 userid_lists = driver.find_elements_by_xpath(USERID_PATH) 87 for userid_list in userid_lists: 88 userid = userid_list.text 89 userids.append(userid) 90 print(userid) 91 time.sleep(random.randint(3,8)) 92 round_page = driver.find_element_by_css_selector(NEXT_PAGE_SELECTOR) 93 round_page.click() 94 time.sleep(random.randint(3,8)) 95 96 97

実行環境(FW/ツールのバージョンなど)

python 3.7
Jupyter notebook
Selenium

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

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

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

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

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

meg_

2019/11/02 03:50

「ループせずに処理が止まってしまう状況」とはどういうことでしょうか? エラーで止まるということですか? 他の状況でしょうか?
growthhackoji3

2019/11/02 04:02

エラーは出ずに処理が停止する状況です。 追記させていただきました!
guest

回答2

0

ベストアンサー

1ページ目に全ユーザーIDが乗っていないなら
そもそもfor文で書くことが誤っていると思います。

python

1while True: 2 user_id = driver.find_element # 略 3 user_ids.append(user_id.text) 4 try: 5 round_page = driver.find_element_by_css_selector(NEXT_PAGE_SELECTOR) 6 except NoSuchElementException: 7 # 次のページへボタンが押せない、つまり最後のページまで読み切った 8 break 9 round_page.click()

後xpathやcss_selectorに頼りすぎているので、
これだと途中でNoSuchElementExceptionを起こす可能性が高いです。
find_element_by_idやfind_element_by_class_nameやfind_element_by_link_textなどが使えたら
なるべくそちらを利用するようにしてください。

投稿2019/11/02 05:48

shirai

総合スコア1290

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

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

growthhackoji3

2019/11/02 07:39

上記のコーデでうまくいきました! 初心者なので問題個所の具体的なコードだけでなく、そのほかの部分までアドバイスいただき本当に助かりました!ありがとうございます!
guest

0

このループでは、1ページ目のHTMLからしかUserIDを取得できていないように思えます。

以下の処理でUserIDを取得している認識で正しいのであれば、
この処理は、ページ遷移後にも行わなければならないと思います。
なので、for文の中に取得処理を追加すれば次のページでも問題なく取得できるのではないでしょうか。

Python

1userid_lists = driver.find_elements_by_xpath(USERID_PATH)

投稿2019/11/01 18:01

Akihito_Jv

総合スコア64

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問