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

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

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

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

Q&A

解決済

1回答

5818閲覧

python seleniumで2番目以降のaタグのhref属性を取得したいです

kakini

総合スコア40

Python 3.x

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

0グッド

0クリップ

投稿2020/02/05 12:30

現在したらばのサイトでサイト内のスレッドを検索にかけてその表示された各スレッドへのリンクがあるのですが
このリンクの文字列(href)を取得する時必ず一番上の一番目の項目しか取得してくれません
2番目以降の任意のリンクの文字列(href)を取得する方法を教えていただけないでしょうか

python

1from selenium import webdriver 2 3driver = webdriver.Chrome("c:/driver/chromedriver.exe") 4driver.get("https://jbbs.shitaraba.net/bbs/subject.cgi/game/45148/") 5 6elem_search_word=driver.find_element_by_name("q") 7elem_search_word.send_keys("ランク") 8elem_search_btn = driver.find_element_by_xpath("/html/body/header/form/input[2]") 9elem_search_btn.click() 10 11 12elems = driver.find_elements_by_class_name('thread-list') 13for elem in elems: 14 elem_url=elem.find_element_by_tag_name("a").get_attribute("href") 15 print(elem_url)

コードを実行すると最後の行のprint(elem_url)の部分に一番最初のリンクのみが挿入されていますが
これの2番目14番目等の任意の場所のリンクを出すにはどうしたらいいのでしょうか

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

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

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

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

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

guest

回答1

0

ベストアンサー

find_element_by_tag_nameだと先頭の1つだけです。
find_elements_by_tag_nameと複数形にすると、リストで全部得られます。

投稿2020/02/05 12:45

otn

総合スコア84555

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

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

kakini

2020/02/05 12:51

回答ありがとうございます。 find_elements_by_tag_nameというのは 14行目の elem_url=elem.find_elements_by_tag_name("a").get_attribute("href") ここの部分のことでしょうか? 自分もsを付けて試してみましたが、下記の様なエラーが出てきました Traceback (most recent call last): File "C:\Users\user\AppData\Local\Programs\Python\Python36-32\スクレイピング\chrome.py", line 14, in <module> elem_url=elem.find_elements_by_tag_name("a").get_attribute("href") AttributeError: 'list' object has no attribute 'get_attribute' どこがいけないのでしょうか?
otn

2020/02/05 12:53 編集

メッセージの通りです。listなので、get_attributeはできません。 個々の要素を取り出してください。 「リストで得られる」と書いたのですが。。。
kakini

2020/02/05 13:02

失礼しましたget_attributeは外してよかったんですね。 一応リストらしき物は得られたのですが printを使って表示してみると下記の様な文字列が出てきました [<selenium.webdriver.remote.webelement.WebElement (session="030863f01876e3745653425a40509a3f", element="4e1c0e24-f02e-4b3e-86e3-c01856720d72")>, <selenium.webdriver.remote.webelement.WebElement (session="030863f01876e3745653425a40509a3f", element="132f9938-09e2-48f9-b977-ca017bbc6ff7")>, <selenium.webdriver.remote.webelement.WebElement (session="030863f01876e3745653425a40509a3f", element="1a2d7a83-0bb0-4641-8e3e-456788544373")>, <selenium.webdriver.remote.webelement.WebElement (session="030863f01876e3745653425a40509a3f", element="ecd91b2b-3606-400f-9475-52980796bf22")>, <selenium.webdriver.remote.webelement.WebElement (session="030863f01876e3745653425a40509a3f", element="b9b33e29-8219-416f-8b4a-5c4c173d4530")>, <selenium.webdriver.remote.webelement.WebElement (session="030863f01876e3745653425a40509a3f", element="872da60f-96bd-4d0d-aeb1-8bbbbce21aeb")>, <selenium.webdriver.remote.webelement.WebElement (session="030863f01876e3745653425a40509a3f", element="4b34aac3-1f1b-4af7-a6ea-af2c8d845bfc")>, <selenium.webdriver.remote.webelement.WebElement (session="030863f01876e3745653425a40509a3f", element="2c72e48a-5845-4d26-bb40-c43d1f9b367d")>, <selenium.webdriver.remote.webelement.WebElement (session="030863f01876e3745653425a40509a3f", element="f491eaef-82e6-486a-80f3-6236e8fccac9")>, <selenium.webdriver.remote.webelement.WebElement (session="030863f01876e3745653425a40509a3f", element="2cf043b3-c509-4369-a077-dec680e281f5")>, <selenium.webdriver.remote.webelement.WebElement (session="030863f01876e3745653425a40509a3f", element="bcadc365-57e8-4a98-ba8d-1e087c4116ac")>, <selenium.webdriver.remote.webelement.WebElement (session="030863f01876e3745653425a40509a3f", 上記は全部でなく一部のみを貼り付けています。 リストみたいな形で文字列が並んでいますが これを普通のurlの文字列に変換?(この言い方で正しいのか分かりませんが) するにはどうしたらよろしいのでしょうか?
otn

2020/02/05 13:06

変換?hrefを取り出したいという話じゃなかったんですか?
kakini

2020/02/05 13:12

すみません、そうですhrefを取り出すのが目的です。 言葉の使い方がおかしかったみたいです。 上記の文字列だと普通のurlと違うみたいだったので変換でもするのかと思いました 自分が欲しい文字列は https://jbbs.shitaraba.net/bbs/read.cgi/game/45148/1503462381/l50 https://jbbs.shitaraba.net/bbs/read.cgi/game/45148/1566713310/l50 ↑この様な文字列なのですが これがhref属性の筈ですけど、これの取得の仕方がまだ分かっていないので質問させて頂きました
otn

2020/02/05 13:14

?? .get_attribute("href") では?
kakini

2020/02/05 13:22

すみません、書き方がよく分かりません 先ほど教えて頂いてコードを下記の様に書き換えました from selenium import webdriver driver = webdriver.Chrome("c:/driver/chromedriver.exe") driver.get("https://jbbs.shitaraba.net/bbs/subject.cgi/game/45148/") elem_search_word=driver.find_element_by_name("q") elem_search_word.send_keys("ランク") elem_search_btn = driver.find_element_by_xpath("/html/body/header/form/input[2]") elem_search_btn.click() elems = driver.find_elements_by_class_name('thread-list') for elem in elems: elem_url=elem.find_elements_by_tag_name("a") print(elem_url) ↑これを実行した結果print関数で出てきたのが、先ほどの長文の文字列です 自分が出したいのは一つ上に書かせて頂いた https://jbbs.shitaraba.net/bbs/read.cgi/game/45148/1503462381/l50 https://jbbs.shitaraba.net/bbs/read.cgi/game/45148/1566713310/l50 この文字列をfor文で繰り返して254個(スレッドの総数)print関数で出したいのですが 書き方が分からないのでそれを教えていただけないでしょうか
kakini

2020/02/05 13:26

申し訳ありません上記のコードで訂正がありますfor文の後にインデントが入ってませんでした from selenium import webdriver driver = webdriver.Chrome("c:/driver/chromedriver.exe") driver.get("https://jbbs.shitaraba.net/bbs/subject.cgi/game/45148/") elem_search_word=driver.find_element_by_name("q") elem_search_word.send_keys("ランク") elem_search_btn = driver.find_element_by_xpath("/html/body/header/form/input[2]") elem_search_btn.click() elems = driver.find_elements_by_class_name('thread-list') for elem in elems: elem_url=elem.find_elements_by_tag_name("a") print(elem_url)
otn

2020/02/05 13:35 編集

elems = driver.find_elements_by_class_name('thread-list') for elem in elems: が分かってちゃんと書けているので、当然、 elem_as=elem.find_elements_by_tag_name("a") for elem_a in elem_as: print(elem_a.get_attribute("href")) くらいは書けるものだと思っていました。 自分で書いたのではなくて、意味が分からないままコピペしただけだったんでしょうか?
kakini

2020/02/05 13:43

ありがとうございます。 elems=dri・・・-list") for ・・・ems: 等は一応自分で調べて書きましたが seleniumの基本的な動作は公式サイトの説明だけでは理解できなかったため 各々のネットの記事で断片的に見ただけなので、動作に関する事はまだよく分かっていません 一応最初のコードも色々試行錯誤しながら組み立てたのですが まだうまく扱う事は出来ないです
otn

2020/02/05 13:48

seleniumの使い方というより、for in の機能とlistとは何であるかの、Python基礎知識です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問