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

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

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

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

selenium

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

Q&A

解決済

1回答

3343閲覧

Python Selenium 複数ある<table>の特定の<table>内に含まれる<td>のみ取得したい

fukushima_ekubo

総合スコア24

Python

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

selenium

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

0グッド

0クリップ

投稿2022/06/15 08:39

編集2022/06/15 09:39

※Pythonを学び始めてから日が浅く、質問内容に不備不足等ございましたら申し訳ありません。

知りたいこと

以下のような構造の<tabel>から、<tabel id="table1">に含まれる<td>のみを取得したいと考えています。

Python

1<table id="table1"> 2  <tbody> 3    <tr> 4      <td> 5      <td> 6    </tr> 7  </tbody> 8</table> 9 10<table id="table2"> 11  <tbody> 12    <tr> 13      <td> 14      <td> 15    </tr> 16  </tbody> 17</table>

検索をしたところ、以下のような記述で取得ができるという記事があったのですが、実行するとエラーが出てしまいます。

Python

1list = [] 2 3pickup = driver.find_elements(by=By.ID,'table1') 4elements = pickup.find_elements(by=By.TAG_NAME,'td') 5for e in elements: 6 list.append(e.text) 7 8print(list)

エラー文

Traceback (most recent call last): File "〜〜.py", line 60, in <module> elements = pickup.find_elements(By.TAG_NAME,'td') AttributeError: 'list' object has no attribute 'find_elements'

お手数ですが、誤っている部分などございましたらご教示頂けますと幸いです。

またこれは本質問の趣旨とは逸れますが、
driver.find_elements(by=By.〜〜)とdriver.find_elements(By.〜〜)の違いについても、教えて頂けますと幸いです。

よろしくお願いいたします。

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

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

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

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

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

melian

2022/06/15 08:41

"table" が "tabel" になっています。
fukushima_ekubo

2022/06/15 08:44

修正いたしました。失礼いたしました。
TakaiY

2022/06/15 09:03

修正しても、問題はそのままですか?
fukushima_ekubo

2022/06/15 09:07

質問内容の構造は自分で書いたものなので、問題となっている部分は分からないままです!
TakaiY

2022/06/15 09:15

「うまくいきません。」というのは具体的にどのような問題があるのでしょう。
fukushima_ekubo

2022/06/15 09:18

具体的な質問ができておらず申し訳ありませんでした。 エラーとして、以下の内容が出ております。 elements = pickup.find_elements(By.TAG_NAME,'td') AttributeError: 'list' object has no attribute 'find_elements'
TakaiY

2022/06/15 09:30

回答はここに書くのではなく、質問をいてください。 また、エラーは省略せずに全て記載してください。(今回はわかりそうですが)
fukushima_ekubo

2022/06/15 09:40

ありがとうございます。エラー文追記しました。
guest

回答1

0

ベストアンサー

「driver.find_elements」は該当するエレメントのリストを返します。要素が1つであってもです。なので、pickupにはリストが入っているため、次の「pickup.find_elements」で 「リストにはfind_elementsメソッドは無いよ」と言われているのです。

このまま使うのであれば、リストとして扱う必要があります。(これ動きませんけどね。 理由は後述)

python

1pickups = driver.find_elements(by=By.ID,'table1') 2 for pickup in pickups: 3 elements = pickup.find_elements(by=By.TAG_NAME,'td') 4 for e in elements: 5 list.append(e.text)

もしくは、table1は1つしか無いとわかっているとか、最初のものだけ読めばよければ、最初にみつけたエレメントを返す 「driver.find_element」(sが無いのに注意)を使いましょう。

こんな感じ(これも動きませんが)

python

1pickups = driver.find_element(by=By.ID,'table1') 2elements = pickup.find_elements(by=By.TAG_NAME,'td') 3for e in elements: 4 list.append(e.text)

動かない理由ですが

driver.find_elements(by=By.〜〜)とdriver.find_elements(By.〜〜)の違いについても、教えて頂けますと幸い

この質問に関連します。
find_elementsメソッドは、

text

1find_element(by='id', value=None)

こうなっています。
通常、関数/メソッド呼び出しのときには、この順で指定します。(これなら動きます)

python

1pickups = driver.find_element(By.ID,'table1')

この場合は、By.IDがbyに、'table1' がvalueにわりあてられて実行されます。

引数を明示することもできます。(これも動きます)

python

1pickups = driver.find_element(by=By.ID,value='table1')

そして、このように明示すれば、省略したり、お勧めましませんが、逆にしていすることもできます
ただし、引数の名前を指定する場合、一度名前を指定したら、以降のものは必ず指定しなければいけません。

python

1pickups = driver.find_element(by=By.ID,'table1')

これはだめなのです。一度指定したら、以降はずっと指定する必要があります。

どちらの方法を採るかは、好きにすればいいと思いますが、どちらかに統一したほうが見やすいでしょうね。

投稿2022/06/15 12:02

編集2022/06/15 12:04
TakaiY

総合スコア12765

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

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

fukushima_ekubo

2022/06/15 12:55

とてもよく分かりました。勉強になりました。 TakaiYさんのように、丁寧に教えて頂ける方のおかげで、楽しくプログラミングができています。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問