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

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

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

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

Python 3.x

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

1回答

1660閲覧

Python 次へボタンを最後まで押したときの処理がわからない

1997

総合スコア1

スクレイピング

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

Python 3.x

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2022/02/23 03:09

わからないこと

ハローワークの求人情報をスクレイピングするコードを書いています。求人情報を絞って検索したページから最後のページまでは問題なく動きました。しかし最後のページに到達したときの条件文がわかりません。

試したこと、知りたいこと

python

1<input type="submit" name="fwListNaviBtnNext" value="次へ>" disabled="">

最後のページのボタンにだけ disabled="" この要素があるのがヒントになると思っています。自分で試した条件文は以下のようなコードです。

python

1while browser.find_elements_by_css_selector("input.disabled") != None:

disabled=""が現れた時に時にループ処理を終了するような条件文はどのようにして書くのでしょうか?それとも考え方自体が間違っているのでしょうか?条件式の書き方をご教授ください。初めて書いたコードになります。よろしくお願いします。

python

1from selenium import webdriver 2import chromedriver_binary 3from selenium.webdriver.support.ui import Select 4from selenium.webdriver.chrome import service as fs 5import time 6import requests # bs ファイルデータダウンロード 7from bs4 import BeautifulSoup 8import re 9import urllib.request 10from selenium.common.exceptions import NoSuchElementException 11 12#ハローワークインターネットサービスのURL 13url = "https://www.hellowork.mhlw.go.jp/" 14 15#chromeDriverを任意の場所に保存、DRIVER_PATHに設定 16CHROMEDRIVER = "C:/Users/user/.atom/HW/Chromedriver.exe" 17chrome_service = fs.Service(executable_path=CHROMEDRIVER) 18browser = webdriver.Chrome(service=chrome_service) 19browser.get(url) 20time.sleep(2) 21 22#求人情報をクリック 23browser.find_element_by_css_selector(".button.blue.main.retrieval_icn").click() 24time.sleep(2) 25 26#大阪府内で探す 27element = browser.find_element_by_id("ID_tDFK1CmbBox") 28Select(element).select_by_value("27") # 大阪府 29time.sleep(2) 30 31#市区町村を選ぶために選択をクリック 32button = browser.find_element_by_id("ID_Btn") 33button.click() 34time.sleep(2) 35 36#市区町村のドロップダウンリストを選択 37element = browser.find_element_by_id("ID_rank1CodeMulti") 38 39# 【西日本】市区町村名コード(5桁・6桁)一覧(更新:2019.9.15)r 40# http://www13.plala.or.jp/bigdata/municipal_code_2.html 41#市区町村コードを基に、5つまで市区町村名を選択 42Select(element).select_by_value("27127") 43Select(element).select_by_value("27102") 44Select(element).select_by_value("27103") 45Select(element).select_by_value("27106") 46Select(element).select_by_value("27107") 47Select(element).select_by_value("27109") 48time.sleep(2) 49 50#OKをクリック 51browser.find_element_by_id("ID_ok").click() 52time.sleep(2) 53 54#職業分類の選択をクリック 55buttons = browser.find_elements_by_css_selector("input.button") 56buttons[7].click() 57time.sleep(2) 58 59#職業分類のドロップダウンリストを選択 60element1 = browser.find_element_by_id("ID_rank00Code") 61 62#B 専門的・技術的職業を選択 63Select(element1).select_by_value("B") 64time.sleep(2) 65 66#下位をクリック 67browser.find_element_by_id("ID_down").click() 68time.sleep(2) 69 70#下位のドロップダウンリストを選択 71element2 = browser.find_element_by_id("ID_rank00Code") 72 73#10 情報処理・通信技術者を選択 74Select(element2).select_by_value("10") 75time.sleep(2) 76 77#下位をクリック 78browser.find_element_by_id("ID_down").click() 79time.sleep(2) 80 81#下位のドロップダウンリストを選択 82element3 = browser.find_element_by_id("ID_rank00Code") 83 84#ソフトウェア開発技術者を選択 85Select(element3).select_by_value("104") 86time.sleep(2) 87 88#下位をクリック 89browser.find_element_by_id("ID_down").click() 90time.sleep(2) 91 92#下位のドロップダウンリストを選択 93element4 = browser.find_element_by_id("ID_rank00Code") 94 95#気になる職業を選択 96Select(element4).select_by_value("10401") # WEBオープン系 97time.sleep(2) 98 99#決定をクリック 100browser.find_element_by_id("ID_ok").click() 101time.sleep(2) 102 103#職業分類の選択をクリック 104buttons = browser.find_elements_by_css_selector("input.button") 105buttons[8].click() 106time.sleep(2) 107 108#職業分類のドロップダウンリストを選択 109element1 = browser.find_element_by_id("ID_rank00Code") 110 111#B 専門的・技術的職業を選択 112Select(element1).select_by_value("B") 113time.sleep(2) 114 115#下位をクリック 116browser.find_element_by_id("ID_down").click() 117time.sleep(2) 118 119#下位のドロップダウンリストを選択 120element2 = browser.find_element_by_id("ID_rank00Code") 121 122#10 情報処理・通信技術者を選択 123Select(element2).select_by_value("10") 124time.sleep(2) 125 126#下位をクリック 127browser.find_element_by_id("ID_down").click() 128time.sleep(2) 129 130#下位のドロップダウンリストを選択 131element3 = browser.find_element_by_id("ID_rank00Code") 132 133#ソフトウェア開発技術者を選択 134Select(element3).select_by_value("104") 135time.sleep(2) 136 137#下位をクリック 138browser.find_element_by_id("ID_down").click() 139time.sleep(2) 140 141#下位のドロップダウンリストを選択 142element4 = browser.find_element_by_id("ID_rank00Code") 143 144#気になる職業を選択 145Select(element4).select_by_value("10404") # 汎用機系 146time.sleep(2) 147 148#決定をクリック 149browser.find_element_by_id("ID_ok").click() 150time.sleep(2) 151 152#職業分類の選択をクリック 153buttons = browser.find_elements_by_css_selector("input.button") 154buttons[9].click() 155time.sleep(2) 156 157#職業分類のドロップダウンリストを選択 158element1 = browser.find_element_by_id("ID_rank00Code") 159 160#B 専門的・技術的職業を選択 161Select(element1).select_by_value("B") 162time.sleep(2) 163 164#下位をクリック 165browser.find_element_by_id("ID_down").click() 166time.sleep(2) 167 168#下位のドロップダウンリストを選択 169element2 = browser.find_element_by_id("ID_rank00Code") 170 171#10 情報処理・通信技術者を選択 172Select(element2).select_by_value("10") 173time.sleep(2) 174 175#下位をクリック 176browser.find_element_by_id("ID_down").click() 177time.sleep(2) 178 179#下位のドロップダウンリストを選択 180element3 = browser.find_element_by_id("ID_rank00Code") 181 182#ソフトウェア開発技術者を選択 183Select(element3).select_by_value("104") 184time.sleep(2) 185 186#下位をクリック 187browser.find_element_by_id("ID_down").click() 188time.sleep(2) 189 190#下位のドロップダウンリストを選択 191element4 = browser.find_element_by_id("ID_rank00Code") 192 193#気になる職業を選択 194Select(element4).select_by_value("10402") # 組み込み・制御系 195time.sleep(2) 196 197#決定をクリック 198browser.find_element_by_id("ID_ok").click() 199time.sleep(2) 200 201#雇用形態を選択 202browser.find_element_by_xpath("//*[@id='ID_koyoFltmCKBox1']").click() 203time.sleep(2) 204 205#詳細検索条件をクリック 206browser.find_element_by_id("ID_searchShosaiBtn").click() 207time.sleep(2) 208 209#賞与アリをクリック 210browser.find_element_by_xpath("//*[@id='ID_shoyoAriCKBox1']").click() 211time.sleep(2) 212 213#派遣・請負を含まないを選択 214browser.find_element_by_id("ID_LhakenUkeoinCKBox3").click() 215time.sleep(2) 216 217#学歴不問をクリック 218browser.find_element_by_id("ID_grkiFumonCKBox").click() 219time.sleep(2) 220 221#OKをクリック 222browser.find_element_by_xpath("//*[@id='ID_saveCondBtn']").click() 223time.sleep(2) 224 225#検索をクリック 226browser.find_element_by_id("ID_searchBtn").click() 227time.sleep(2) 228 229#表示件数ドロップダウンリストをクリック 230element5 = browser.find_element_by_id("ID_fwListNaviDispTop") 231 232#50件を選択 233Select(element5).select_by_value("50") 234time.sleep(2) 235 236#browser.close() 237# 今見ているページをBeautifulSoupで解析 238soup = BeautifulSoup(browser.page_source, "html.parser") 239 240# 「求人」のテーブルを検索 241jobs = soup.find_all("table", attrs={"class": "kyujin"}) 242 243#検索結果を格納する"message"を初期化 244message = "" 245 246 247for i, job in enumerate(jobs): 248 job_name = str(job.find("td", attrs={"class": "m13"}).text.strip()) 249 #ページ内のclass指定 仕事内容とか 250 salary_tags = job.find_all("tr", attrs={"class": "border_new"})[ 251 5].select(".disp_inline_block") 252 #urlの前半部分 253 url2 = "https://www.hellowork.mhlw.go.jp/kensaku/" 254 #リンクを取得 255 job_link = job.find('a', id="ID_dispDetailBtn").get( 256 'href').replace('./', '') 257 258 for t, salary_tag in enumerate(salary_tags): 259 job_salary = salary_tag.text 260 job_description = job.find( 261 string='仕事の内容').parent.find_next_sibling().text.replace('\n', '') 262 job_location = job.find( 263 string='就業場所').parent.find_next_sibling().text.replace('\n', '') 264 265 message = message + \ 266 "■{0} ( {1} ){2}\n□{3}\n{4}\n".format( 267 job_name, job_salary, job_description, job_location, url2 + job_link) 268 # 検索結果の出力 269print(message) 270 271 272while browser.find_elements_by_css_selector("input.disabled") != None: 273 browser.find_element_by_name("fwListNaviBtnNext").click() 274 time.sleep(5) 275 # 今見ているページをBeautifulSoupで解析 276 soup = BeautifulSoup(browser.page_source, "html.parser") 277 # 「求人」のテーブルを検索 278 jobs = soup.find_all("table", attrs={"class": "kyujin"}) 279 #検索結果を格納する"message"を初期化 280 message = "" 281 282 for i, job in enumerate(jobs): 283 job_name = str(job.find("td", attrs={"class": "m13"}).text.strip()) 284 #ページ内のclass指定 仕事内容とか 285 salary_tags = job.find_all("tr", attrs={"class": "border_new"})[ 286 5].select(".disp_inline_block") 287 #urlの前半部分 288 url2 = "https://www.hellowork.mhlw.go.jp/kensaku/" 289 #リンクを取得 290 job_link = job.find('a', id="ID_dispDetailBtn").get( 291 'href').replace('./', '') 292 293 for t, salary_tag in enumerate(salary_tags): 294 job_salary = salary_tag.text 295 job_description = job.find( 296 string='仕事の内容').parent.find_next_sibling().text.replace('\n', '') 297 job_location = job.find( 298 string='就業場所').parent.find_next_sibling().text.replace('\n', '') 299 300 message = message + \ 301 "■{0} ( {1} ){2}\n□{3}\n{4}\n".format( 302 job_name, job_salary, job_description, job_location, url2 + job_link) 303 # 検索結果の出力 304 print(message) 305else: 306 print("処理完了") 307 308browser.close()

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

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

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

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

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

guest

回答1

0

ベストアンサー

disabled 属性が存在する場合にループ処理を終了するのであれば以下の様になります。

python

1while True: 2 browser.find_element_by_name("fwListNaviBtnNext").click() 3 time.sleep(5) 4 # 今見ているページをBeautifulSoupで解析 5 soup = BeautifulSoup(browser.page_source, "html.parser") 6 : 7 8 # 検索結果の出力 9 print(message) 10 # break at last page 11 if browser.find_elements_by_css_selector('input[name="fwListNaviBtnNext"][disabled]'): 12 break 13 14print("処理完了") 15browser.close()

投稿2022/02/23 04:28

melian

総合スコア19749

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

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

1997

2022/02/23 04:47

的確な回答ありがとうございました。とにかく動けばいいと思いながらやってきたのでif文やリスト、タプルなどの基本的な知識がありませんでした。今一度基礎を見直してみます。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問