質問するログイン新規登録
Python 3.x

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

Q&A

解決済

3回答

4002閲覧

python selenium でhref取得について

kingmabo

総合スコア1

Python 3.x

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

0グッド

0クリップ

投稿2022/10/31 08:37

0

0

1:データベース等で自動生成されるWEBで、class属性下で、hrefの取得をしたい。
find_elements_by_class_name("abc")[1].get_attribute("href")
では、get_attributeが取得できない。
find_elements_by_xpath("//div/===/a").get_attribute("href")
で取得できるが、===の部分が都度変化して、div構成などのデータ巣数が増減するため、取得しにくい。
class属性下においてhrefを取得する方法はありますか?
ない場合、xpath直接指定以外の方法はあるでしょうか?

2:上記のようにclass属性での繰り返し(同じclass名が反復される)で、データが生成される場合、for文(i)で周回取得したいが、forの数値(0~)を添え字として周回させたい場合、
find_elements_by_class_name("abc")[ + str(i) + ].get_attribute("text")
とすると、]の位置でsyntax error になってしまうので、解消したい。

よろしくお願いします。

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

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

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

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

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

otn

2022/10/31 10:30

> では、get_attributeが取得できない。 具体的に、どういう現象(実行結果)でしょうか?
kingmabo

2022/10/31 12:38

driver.find_elements_by_class_name("abc")[0].get_attribute("href") で IndexError: list index out of range エラーがでます。
kingmabo

2022/11/01 09:51

取得できるページソース(<div id="app"></div>ここにページが生成されます) <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> <link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin=""> <link rel="dns-prefetch" href="//fonts.googleapis.com"> <link href="https://fonts.googleapis.com/css?family=Noto+Sans+JP:400,700|Roboto:400,700&display=swap&subset=japanese" rel="stylesheet"> <link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> <link rel="manifest" href="/site.webmanifest"> <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"> <meta name="msapplication-TileColor" content="#da532c"> <meta name="theme-color" content="#ffffff"> <meta name="referrer" content="no-referrer-when-downgrade"> <meta name="twitter:card" content="summary_large_image"> <!-- posthtml-modules --> <meta http-equiv="Content-Security-Policy" content="script-src-elem 'self' 'sha256-kZS1F1CAAcsK4W77tPu6k1p14hSRok1WCwYy29wLoy0=' 'sha256-pjDsC8gzF0TA4t7BkL/xu2j2e8Y27oL2cC5tsfYKlkQ=' 'sha256-E1xT4qt1xv+TGmSHsamjYL47BgB0UIjo5M9ECWstDzE=' 'sha256-hNCw9/hWd37RuOKANeZK28lDmdfH2kaDXGI64ZHl72k=' 'sha256-O7OdOpBvtMA3Y7phxNojIa5nIGmUtlW6rNcg1KXs3HE=' 'sha256-YVTnuSin4zQHa6JR0kcF9HRNd6pWeRJ8SezekDy+iBE=' 'sha256-T9h4ixy0FtNsCwAyTfBtIY6uV5ZhMeNQIlL42GAKEME=' 'sha256-7huIvJqiU8uJtld7FifrHukQiVMAzXpQ/D9QjVWuQRE=' 'sha256-O2MxKooJgEbLykXswZrjewXwcPUvViOdvGo3UB2Tjtc=' https://optimize.google.com https://www.googleoptimize.com/optimize.js https://maps.googleapis.com https://pi.pardot.com/pd.js https://pi.pardot.com/analytics https://googleads.g.doubleclick.net/ https://s.yimg.jp/images/listing/tool/cv/ytag.js https://connect.facebook.net https://polyfill.io/v3/polyfill.min.js http://sashare.com/b/sokus.js https://*.clarity.ms https://www.googletagmanager.com/gtag/js https://www.googletagmanager.com/gtm.js https://www.google-analytics.com/analytics.js https://connect.facebook.net/en_US/fbevents.js https://www.googleadservices.com/pagead/conversion_async.js; style-src-elem 'self' https://optimize.google.com https://fonts.googleapis.com 'unsafe-inline';"> <meta property="og:url" content="https://www.jobantenna.jp/"> <meta property="og:title" content="沖縄の求人・転職ならジョブアンテナ"> <meta property="og:description" content="沖縄の求人・転職ならジョブアンテナ | 沖縄県内企業の求人情報と会社情報を豊富に提供しています。沖縄専門の求人・転職サービスです。"> <meta property="og:image" content="https://www.jobantenna.jp/og-image.jpg"> <meta name="facebook-domain-verification" content="xjs20bs0xokzwgsy8gywkv4viopsom"> <script type="module" crossorigin="" src="/assets/index.1449fc80.js"></script> <link rel="modulepreload" href="/assets/vendor.6a70e59a.js"> <link rel="stylesheet" href="/assets/index.9f8d4adb.css"> <script type="module">!function(){try{new Function("m","return import(m)")}catch(o){console.warn("vite: loading legacy build because dynamic import is unsupported, syntax error above should be ignored");var e=document.getElementById("vite-legacy-polyfill"),n=document.createElement("script");n.src=e.src,n.onload=function(){System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))},document.body.appendChild(n)}}();</script> </head> <body> <div id="app"></div> <script src="https://polyfill.io/v3/polyfill.min.js?features=IntersectionObserver"></script> <script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script> <script nomodule id="vite-legacy-polyfill" src="/assets/polyfills-legacy.7a9fcf25.js"></script> <script nomodule id="vite-legacy-entry" data-src="/assets/index-legacy.d588ba11.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script> </body> </html> 要素はこちらの画像にて https://ibb.co/hfRhMQK
kingmabo

2022/11/01 09:59

取得したいのは、htrfですが、driver.find_elements_by_class_name("searchOffersPage-jobCard-wrapper") などの、class取得で attributeerror 'webdriver' object has no attribute になってしまいます
guest

回答3

0

ベストアンサー

これでどうでしょうか?今回はちゃんとやってみたので、大丈夫だと思います。

python

1elements = driver.find_elements_by_xpath('//*[@class="abc"]//a') 2for elm in elements: 3 print(elm.get_attribute('href'))

投稿2022/11/02 14:40

yshima1129

総合スコア179

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

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

kingmabo

2022/11/02 15:25

取れました! できればclassのみでいきたかったですが、意味合いはおなじですから、これでいきます! ありがとうございました。
guest

0

find_elements_by_class_name("abc")[1].get_attribute("href")

というのは、<a class="abc" href="~~~">というようなクラスabcを持つaタグが複数個あって、その2番目のaタグのhrefを取得するという意味ですが、やりたいことと合ってないのでは?
(aタグじゃなくてlinkタグなどhref属性を持つ他のタグかも知れませんが)

find_elements_by_class_name("abc")[ + str(i) + ].get_attribute("text")

これは、「まず、Python言語に入門しましょう」というしかないですが、意図としては、
find_elements_by_class_name("abc")[i].get_attribute("text")という事でしょうね。

投稿2022/10/31 10:45

otn

総合スコア86367

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

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

kingmabo

2022/10/31 12:42

find_elements_by_class_name("abc")[i].get_attribute("text") こちら、これですね。xpathにとらわれすぎていました。iを文字列にすることはないですよね。
otn

2022/10/31 13:34

> driver.find_elements_by_class_name("abc")[0].get_attribute("href") > で > IndexError: list index out of range 添え字が0で、index out of rangeがでるということは、空のリストということです。 一気に最後を見て駄目な時は戻りましょう。 まずは、 abc = driver.find_elements_by_class_name("abc") print(abc) とか。
guest

0

xpathでclassを指定するには以下で出来ます。

//*[@class="abc"]

forのところは実際のコードを見てみないとわからないですが、以下を参考にやってみるといいかもしれません。
https://qiita.com/Morio/items/6b0948eb393d41f1f53e

投稿2022/10/31 08:52

編集2022/10/31 08:54
yshima1129

総合スコア179

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

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

kingmabo

2022/10/31 13:05

それを実行すると、セッションが格納されてしまいます。 これって何か別の指定法あるのでしょうか? [<selenium.webdriver.remote.webelement.WebElement (session="d5726827c2761b64de98847e8c08b7ae", element="5ae0f514-af11-4409-90a1-0e92f5aa19ef")>, <selenium.webdriver.remote.webelement.WebElement (session="d5726827c2761b64de98847e8c08b7ae", element="a82b71ed-fe37-46ae-8767-97f1f3c94b06")>, -----中略----<selenium.webdriver.remote.webelement.WebElement (session="d5726827c2761b64de98847e8c08b7ae", element="ef910f7e-b9b5-4cbb-845b-fb8daf483229")>]
yshima1129

2022/10/31 13:24

それは、複数のエレメントを取得していると思います。 seleniumは忘れていることが多くて・・・申し訳ない。頑張ってください。 以下のサイトがわかりやすいかもしれません。 https://web-tweets.com/python/selenium-findelement/
kingmabo

2022/10/31 15:02

今回のサイトは、jsで生成されているようで、bs4ではうまくいかず、seleniumを使わないといけなくて。。。 で、xpathで、直指定すると問題なくhrefは取得できます。 div2。。。などの形式で。 しかし、divの数が変化するので、全パターンを切り分けするような面倒なやり方しか思いつかず、classで判別できれば、簡単に行けると思いましたが、href取得がうまくいかず、詰まっていました。
yshima1129

2022/10/31 22:13

jsで読み込みしているなら、jsの処理前にseleniumが読んでしまい、欲しいデータが取れない場合も考えられます。 以下のように遅延の処理を入れるのもよいかもしれません。 https://tanuhack.com/stable-selenium/ 直接指定すると問題なくとれるhrefって、どんな感じのコードでしょうか。 divが変化するとありますが、xpathは変化する部分を「*」を指定することでなんでも良いと指定できます。
kingmabo

2022/11/01 09:28

bs4だと上記現象が起きてしまいますが、seleniumでは、今のところ読み込みに問題はありませんと思いこんできましたが、今上記テストしようとしたら、昨日まで読み込んでいたのが、なぜか今よみ込めません。 質問のコメントに、追記します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問