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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

968閲覧

celeniumのfind_element_by_について

yasutin

総合スコア41

Python 3.x

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2022/12/25 15:48

編集2022/12/25 15:54

前提

楽天のレビューからレビューアーの名前をスクレイピングしたいと考えています。

実現したいこと

・find_element_ を用いてレビューアーの名前を取得したい。

発生している問題・エラーメッセージ

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"#revRvwSec > div.revRvwMain > div > div.revRvwUserSecCnt > div:nth-child(1) > div.revRvwUserHead > ul > li.revUserFaceDtl > dl > dt > a"}

該当のソースコード

取得したい要素の写真

python

1import os 2import time 3import pandas as pd 4from selenium import webdriver 5import chromedriver_binary 6from selenium.webdriver.support.ui import WebDriverWait 7 8 9CURRENT_DIR = os.getcwd() 10 11#https://review.rakuten.co.jp/item/1/333216_10001503 ワイヤレスイヤホン 12 13ID = "333216_10001503"#ワイヤレスイヤホン 14URL = "https://review.rakuten.co.jp/item/1/" + ID + "/" 15#例:https://review.rakuten.co.jp/item/1/268158_10000003/1.1/(伊勢エビ) 16 17times = 10 18 19columns = ["name","score","age","sex","date","text"] 20df = pd.DataFrame(columns=columns) 21 22# 23#selenium 24# 25op = webdriver.ChromeOptions() 26browser = webdriver.Chrome(options=op) 27 28for i in range(times): 29 browser.get(URL + str(i) + ".1/") 30 31 reviews = browser.find_elements_by_css_selector("div.revRvwUserSec") 32 for review in reviews: 33 age_and_sex = review.find_elements_by_css_selector("span.revUserFaceDtlTxt span")[0].text 34 age = None 35 sex = "" 36 if age_and_sex != "": 37 li = age_and_sex.split() 38 if len(li) == 2: 39 age = li[0][:2] 40 sex_p = li[1] 41 if sex_p == "男性": 42 sex = 0 43 else: 44 sex = 1 45 else: 46 age = li[0] 47 48 name = review.find_element_by_css_selector("#revRvwSec > div.revRvwMain > div > div.revRvwUserSecCnt > div:nth-child(1) > div.revRvwUserHead > ul > li.revUserFaceDtl > dl > dt > a").text 49 score = review.find_element_by_css_selector("span.revUserRvwerNum.value").text 50 date = review.find_element_by_css_selector("span.revUserEntryDate.dtreviewed").text 51 text = review.find_element_by_css_selector("dd.revRvwUserEntryCmt.description").text 52 se = pd.Series([name,score,age,sex,date,text],columns) 53 df = df.append(se, columns) 54 if name: 55 print(name) 56 57 58 time.sleep(1) 59 60df.to_csv("review_ear_all.csv",encoding="utf_8_sig") 61browser.quit() 62

試したこと

find_element_by_css_selectorとしたところからそのような要素はみつからないというエラーメッセージから、もしnameがあればprint(name)をするというようにデバッグを試みたが、改善されなかった。

また、最初のレビューアーの要素は取得できたことからそのレビューアー固有の要素を指定してしまっているのではないかと思った。そこでfind_element_by_tag_name("a")としてみたが、ほかの要素を取得してしまい、改善されなかった。

レビューアーの名前のみを取得する指定方法を教えていただきたい。

補足情報(FW/ツールのバージョンなど)

windows11
IDLE

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

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

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

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

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

melian

2022/12/25 18:10

reviews = browser.find_elements_by_css_selector("div.revRvwUserSec") for review in reviews:    : としていますので、以下の様に変更する必要があります。 name = review.find_element_by_css_selector("#revRvwSec > ... => name = review.find_element_by_css_selector("li.revUserFaceDtl > dl > dt > a").text ただ、ここを変更しても別のエラーが発生しますが。。。
yasutin

2022/12/27 15:54

回答ありがとうございます! 「購入者」という表記のレビューアー、つまりここに要素がないレビューアーの場合エラーになってしまうということですよね。。。
yasutin

2022/12/27 15:56

if review.find_element_by_css_selector("li.revUserFaceDtl > dl > dt > a").text: name = review.find_element_by_css_selector("li.revUserFaceDtl > dl > dt > a").text というようにしてみたのですが、要素を指定している時点でエラーが発生してしまっているようです。どのようにすればよいでしょうか。 新しい質問として作成した方がいいでしょうか!そうでしたらおっしゃってください。
melian

2022/12/27 17:11 編集

こちらの環境(BeautifulSoup 4.11.1)ですと、 name = review.find_element(By.CSS_SELECTOR, "li.revUserFaceDtl > dl > dt > *").text とすることで、正常に完了します。(最後にデータフレームが表示されます)
yasutin

2022/12/27 17:21

<a>タグの場合正常に取れました。ありがとうございます! ですが途中で、<span>タグに変わっているからエラーになってしまうのだと思います。 <a>タグの要素(今回取得した要素)、もしくは、<span>タグの要素をnameに格納するにはどうすればいいですか? <span>タグの様子です。↓↓↓ <span style="font-size:120%; font-weight:bold; padding:0px 5px 0px 0px;">購入者</span> 名前設定をしているユーザーの場合<a>タグが存在します。↓↓↓ <a l2id_linkname="body_01" href="https://review.rakuten.co.jp/my/NjM4MjUwYjE5ZTFiNGMxOQ__/1.0.0.1/"> worldtravel</a>
melian

2022/12/27 17:40

はい、こちらでは li.revUserFaceDtl > dl > dt > * の様に "*" を指定することで a タグと span タグの両方を取得できています。もしくは、 name = review.find_element(By.CSS_SELECTOR, "li.revUserFaceDtl > dl > dt").text として、dt タグ全体のテキストを取る様にしてみてはどうでしょうか。ただ、この場合は名前に「さん」が含まれることになります。(replace 関数などで除去してもよいかと)
yasutin

2022/12/28 02:04

li.revUserFaceDtl > dl > dt > * これで実行すると正常に動きました。 ありがとうございます! ベストアンサーにさせていただきます。 回答していただいてもよろしいですか?
melian

2022/12/28 02:12

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

回答2

0

ベストアンサー

※ コメントから転記

CSS セレクタを以下の様に変更します。

python

1name = review.find_element_by_css_selector("#revRvwSec > div.revRvwMain > div > div.revRvwUserSecCnt > div:nth-child(1) > div.revRvwUserHead > ul > li.revUserFaceDtl > dl > dt > a").text 2# => 変更 3name = review.find_element_by_css_selector("li.revUserFaceDtl > dl > dt > *").text

投稿2022/12/28 02:12

melian

総合スコア19771

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

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

0

selenium 4.0 以降では、find_element_by~ といったメソッドは使えなくなってます。4.0 以降は、find_element(by="class", value="revRvwUserSec") といった風に指定します。by 引数に、セレクターの名前を指定し、value にその値を渡します。

個人的には、xpath で指定する方が簡単なのでおすすめです。
開発者ツールのハイライトされている部分で右クリック、コピーを選んで、XPath または Full XPath を選択します。その値を、find_element() の引数 value に渡します。
たとえば、画像で提示されている箇所なら以下のようになります。

python

1driver.find_element("xpath", "/html/body/div[5]/div[1]/div[5]/div[1]/div/div[3]/div[1]/div[1]/ul/li[2]/dl/dt/a")

参照:Finding web elements

投稿2022/12/26 20:02

編集2022/12/26 20:39
Demerara

総合スコア397

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

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

yasutin

2022/12/28 07:30

回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問