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

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

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

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

selenium

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

Q&A

解決済

2回答

609閲覧

seleniumでtable要素を取得したいが指定方法がわからない

noggi

総合スコア8

Python

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

selenium

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

0グッド

0クリップ

投稿2024/01/11 21:05

編集2024/01/12 19:40

実現したいこと

初心者質問で申し訳ありません。
seleniumを使ってHPから情報を取得しようとしています。
https://incidecoder.com/
検索で出てきた商品のURLと商品名を取得したいのですが、エラーが出てしまいます。
ループ処理はとりあえず置いておいて、1箇所だけでも取得しようとしていますが、
FIND_PLACEのところでエラーと言われてしまいます。
詳しい方教えていただけますとありがたいです、よろしくお願いします。

発生している問題・分からないこと

###以下の指定の仕方が違うような気がしています。

エラーメッセージ

error

1Traceback (most recent call last): 2 File "/Users...", line 28, in <module> 3 FIND_PLACE = browser.find_element(By.XPATH, "/html/body/table") 4 File "/Users...", line 742, in find_element 5 return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"] 6 File "/Users...", line 348, in execute 7 self.error_handler.check_response(response) 8 File "/Users...", line 229, in check_response 9 raise exception_class(message, screen, stacktrace) 10selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/table"} 11 (Session info: chrome=120.0.6099.216); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception 12Stacktrace: 130 chromedriver 0x000000010ad75cc8 chromedriver + 4844744 14##略 15

該当のソースコード

取得したいのはhrefリンクとChanel Signature De Chanelのような商品名のテキスト部分です。
全体像は以下の通りです。

<html> <head> <meta name="console-scheme" content="light dark"> </head> <body> <div class="line-gutter-backdrop"></div> <form autocomplete="off"> <label class="line-wrap-control"></label> </form> <table> <tbody> <tr></tr> <tr></tr>   略 <tr>     <td class="line-number" value="268"></td> <td class="line-content"> <span class="html-tag"> "<a " <span class="html-attribute-value html-external-link" target="blank" href="/products/chanel-signature-de-chanel" rel="noneferrer noopener"> /products/chanel-signature-de-chanel</a> "" " <span class="html-attribute-value">klavika simpletextlistitem</span> "">" </span> "Chanel Signature De Chanel"

該当箇所のdiv内は以下の通りです。

<div class="paddingbl">   <a href="/products/chanel-signature-de-chanel" class="klavika simpletextlistitem">Chanel Signature De Chanel</a>   <a href="/products/chanel-ndeg1-de-chanel-revitalizing-serum" class="klavika simpletextlistitem">Chanel N°1 De Chanel Revitalizing Serum</a> ##略 <div class="home-create-box paddingt30"> <span> Can't find what you are looking for? <span class="search-bumper hideotablet"></span> <a href="/products/create"> <button> <img src="https://incidecoder-assets.storage.googleapis.com/assets/img/star_goodie.png" alt=""></img> UPLOAD IT </button> </a> </span> </div> </div>

python

1from selenium import webdriver 2from selenium.webdriver.common.by import By 3import time 4import tqdm 5import pandas as pd 6from selenium.webdriver.chrome.options import Options 7 8MIN_INTERVAL = 0.5 9INTERVAL = 2.5 10MINUTE_INTERVAL = 60 11 12options = Options() 13options.add_argument("--headless") 14 15browser = webdriver.Chrome(options=options) 16time.sleep(INTERVAL) 17browser.get("https://incidecoder.com") 18time.sleep(INTERVAL) 19 20browser.find_element(By.ID, "query").send_keys('chanel') 21browser.find_element(By.XPATH, "//div[1]/div[2]/div[1]/form/input[2]").click() 22input("つづける?") 23time.sleep(INTERVAL) 24 25### 26FIND_PLACE = browser.find_element(By.XPATH, "/html/body/table") 27Find_class = FIND_PLACE.find_elements(By.CLASS_NAME, "line-content") 28for i in Find_class: 29 print(i.text)

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

解決できませんでした。

補足

特になし

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

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

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

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

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

maisumakun

2024/01/11 21:33

当該のHTMLはどのような構造なのですか?
melian

2024/01/12 00:59

遷移後の検索結果のページには table 要素がありませんね。。。div 要素内に各商品へのリンクが並んでいます。
meg_

2024/01/12 03:48

エラーはどの行で出ているのでしょうか?エラーメッセージは抜粋ではなくエラー発生行の情報も含んだ状態で掲載された方が回答者へ親切です。
noggi

2024/01/12 19:37

melian さん ご指摘ありがとうございます。そもそもtable内という質問が間違っていたのかもしれません・・。div内のリンクと商品名が取得できればよいです。 megさん 不慣れなもので申し訳ありませんでした。追記しました。
melian

2024/01/13 02:02

> div内のリンクと商品名が取得できればよいです。 その場合は、FIND_PLACE = ... 以降を以下の様にします。(XPATH ではなく CSS セレクタを使っています) FIND_PLACE = browser.find_elements(By.CSS_SELECTOR, "div[class=paddingbl] > a") for i in FIND_PLACE:  print(i.text)  print(i.get_attribute('href')) ※ div.paddingbl > a とすると、ページネーションの 「Next page」リンクも拾ってしまうので div[class=paddingbl] > a としています。
noggi

2024/01/14 20:11

コメントありがとうございます。完璧に実行できました!Next Pageを外す書き方も非常に勉強になりました。 本当にありがとうございました。 ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
melian

2024/01/14 23:53

ありがとうございます、回答へ転記しました。
guest

回答2

0

ベストアンサー

※ コメントから転記

div内のリンクと商品名が取得できればよいです。

その場合は、FIND_PLACE = ... 以降を以下の様にします。(XPATH ではなく CSS セレクタを使っています)

python

1FIND_PLACE = browser.find_elements(By.CSS_SELECTOR, "div[class=paddingbl] > a") 2for i in FIND_PLACE: 3 print(i.text) 4 print(i.get_attribute('href'))

div.paddingbl > a とすると、ページネーションの 「Next page」リンクも拾ってしまうので div[class=paddingbl] > a としています。

投稿2024/01/14 23:52

melian

総合スコア21185

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

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

0

まず、開発の仕方が間違っています。
ヘッドレスの指定は、完成してから付けます。開発は、ブラウザ画面を見ながら行います。

25行目の直前で、デバッガーで止める、または、input("続行?")等と入れて一旦プログラムを待ちにして、その時点でのブラウザの開発者ツールでHTMLを調べます。bodyの直下にtableタグが無いことが分かるかと思います。おそらく期待している画面と異なるのでしょうね。

投稿2024/01/12 03:11

編集2024/01/12 03:56
otn

総合スコア86316

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

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

noggi

2024/01/14 20:12

プログラム待ちにして調べる必要があるとは知りませんでした。ご指摘いただき本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問