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

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

詳細はこちら
Python

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

selenium

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

Q&A

2回答

1295閲覧

seleniumと正規表現について

sirara

総合スコア13

Python

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

selenium

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

0グッド

0クリップ

投稿2021/01/11 14:04

お世話になっております。
seleniumでのスクレイピングをしております。
以下のコードからの出力で、
(1)httpsから始まるurlを抜き出す
(2)リストに(1)を格納
(3)for文で(2)をクリック・閉じるを繰り返す

ということをしたいと考えております。
どのようにコーディングをすればよいでしょうか?

python

1for class_ in driver.find_elements_by_class_name("bnrBoxInner"): 2 for elem in class_.find_elements_by_tag_name("a"): 3 onclick=elem.get_attribute("onclick") 4 print(onclick)

出力:
doSubmit('827038', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/1181/192/1/-/1/?type=0')
doSubmit('827038', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/1181/192/1/-/1/?type=0')
doSubmit('827037', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/15/225/1/-/1/?type=0')
doSubmit('827037', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/15/225/1/-/1/?type=0')
doSubmit('827028', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/115/453/1/-/1/?type=0')
doSubmit('827028', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/115/453/1/-/1/?type=0')
doSubmit('827036', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4128/558/1/-/1/?type=0')
doSubmit('827036', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4128/558/1/-/1/?type=0')
doSubmit('827043', 'top', 'https://r10.to/hv1vbD')
doSubmit('827043', 'top', 'https://r10.to/hv1vbD')
doSubmit('827039', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/14/877/1/-/1/?type=0')
doSubmit('827039', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/14/877/1/-/1/?type=0')
doSubmit('827034', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4125/558/1/-/1/?type=0')
doSubmit('827034', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4125/558/1/-/1/?type=0')
doSubmit('827032', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4122/558/1/-/1/?type=0')
doSubmit('827032', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4122/558/1/-/1/?type=0')
doSubmit('827031', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4121/558/1/-/1/?type=0')
doSubmit('827031', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4121/558/1/-/1/?type=0')
doSubmit('827033', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4123/558/1/-/1/?type=0')
doSubmit('827033', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4123/558/1/-/1/?type=0')
doSubmit('827030', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4120/558/1/-/1/?type=0')
doSubmit('827030', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4120/558/1/-/1/?type=0')
doSubmit('827040', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/137/287/1/-/1/?type=0')
doSubmit('827040', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/137/287/1/-/1/?type=0')
doSubmit('827035', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4127/558/1/-/1/?type=0')
doSubmit('827035', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4127/558/1/-/1/?type=0')
doSubmit('827029', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4119/558/1/-/1/?type=0')
doSubmit('827029', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/4119/558/1/-/1/?type=0')
doSubmit('827041', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/97/755/1/-/1/?type=0')
doSubmit('827041', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/97/755/1/-/1/?type=0')
doSubmit('827042', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/417/637/1/-/1/?type=0')
doSubmit('827042', 'top', 'https://grp13.ias.rakuten.co.jp/t/r/417/637/1/-/1/?type=0')

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

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

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

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

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

guest

回答2

0

urlを取り出してリストに格納する処理は、こんな感じで行けますが、

python

1import re 2 3 4ptn = re.compile('^.+(http.+)\')$') 5 6for class_ in driver.find_elements_by_class_name("bnrBoxInner"): 7 for elem in class_.find_elements_by_tag_name("a"): 8 onclick=elem.get_attribute("onclick") 9 10 m = ptn.match(onclick) 11 url_list.append(m.group(1)) 12

(3)for文で(2)をクリック・閉じるを繰り返す

これは、URLを取り出して直接アクセスしてもダメじゃないですか?

なぜなら元のaリンクはスクリプトとしてdoSubmit関数を呼び出すように作られているので、その関数を経た後にPOSTでそのURLにアクセスされることが期待されているからです。

素直にクリックするなら、

python

1for class_ in driver.find_elements_by_class_name("bnrBoxInner"): 2 for elem in class_.find_elements_by_tag_name("a"): 3 elem.click() 4

ですが、その後、次のリンクをクリックするために戻る必要があるわけですが、「閉じる」をしてしまうと、次のリンク要素も消えてしまいますね。

上手くいくか分からない方法ですが、無理やりaタグにtarget属性を埋め込んで、別ウィンドウを開くように編集してからクリックする、という手はあるかもしれません。

python

1 2# a タグ全部にtarget属性を付けるJavascriptを走らせる 3driver.execute_script("Array.from(document.getElementsByTagName('a')).forEach(a => a.setAttribute('target', 'top'));") 4 5 6for class_ in driver.find_elements_by_class_name("bnrBoxInner"): 7 for elem in class_.find_elements_by_tag_name("a"): 8 # a をクリックする(別ウィンドウで開く) 9 elem.click() 10 11 # 最後に開いたウィンドウにスイッチする 12 driver.switch_to.window(driver.window_handles.last) 13 14 # 閉じる 15 driver.close() 16

投稿2021/01/11 15:07

umau

総合スコア831

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

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

0

前の質問の続きですね。<a href="~~~">じゃなかったのか。

umauさんのお書きのように、JavaScriptの中に書かれているURLを直節getしても駄目でしょう。

Python

1a_onclicks = [] 2for class_ in driver.find_elements_by_class_name("bnrBoxInner"): 3 for elem in class_.find_elements_by_tag_name("a"): 4 onclick=elem.get_attribute("onclick") 5 print(onclick) 6 a_onclicks.append(onclick) 7 8for scr in a_onclicks: 9 driver.execute_script(scr) 10 ~~~ 11 driver.get("元のページ")

ですかね。
これでもうまく行くかは、向こうの作りによると思いますが。

投稿2021/01/12 04:37

編集2021/01/12 04:48
otn

総合スコア85893

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問