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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

selenium

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

HTML

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

Q&A

1回答

4394閲覧

python×selenium .textを取得したいのに空文字で返ってくる

Yoshitsugu12

総合スコア15

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

selenium

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

HTML

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

0グッド

0クリップ

投稿2021/04/07 11:15

編集2021/04/07 15:17

前提・実現したいこと

あるwebサイト(Garoon)のテキスト情報をseleniumで取得したいのですが、空文字で返ってきます。

エラーなどは特に出ていません。

###サイトのHTML構造(上層は省略)

<table> <tbody> <tr> <td class="A" style="width:60%;"> " 2962&nbsp;:" == $0 <span class="C"> <a href="D">...</a> </span> "2021年04月02日(金) 16:11 " == $0 </td> <td>...</td> </tr> </tbody> </table>

該当のソースコード

python

1from selenium import webdriver 2from time import sleep 3from getpass import getpass 4import csv 5import datetime 6 7 8def garoon_comment_number(): 9 10 #user情報の入力 11 username = input("your loginname:") 12 password = getpass('your password: ') 13 14 driver = webdriver.Chrome("C:/dev/tools/chromedriver_win32/chromedriver.exe") 15 driver.get("URL") 16 17 #ログイン名をログイン画面へ入力する 18 usernamebar = driver.find_element_by_name("_account") 19 usernamebar.send_keys(username) 20 #ログインパスワードをログイン画面へ入力する 21 passwbar = driver.find_element_by_name("_password") 22 passwbar.send_keys(password) 23 24 driver.find_element_by_name("login-submit").click() 25 26 sleep(5) 27 28  #番号を取得 29 max_num_comment = driver.find_element_by_xpath("//tbody/tr/td") 30 max_num = max_num_comment.text 31 max_num = max_num.replace(" ", "") 32 print("----------------------") 33 print(max_num_comment)#text 34 print("----------------------") 35 #print(max_num_comment) 36 37 input() 38 39def main(): 40 garoon_comment_number() 41 42main() 43

###上記コードの出力結果

your loginname:USER名 your password: DevTools listening on ws://127.0.0.1:49958/devtools/browser/6ccde4d6-7462-443e-a773-74664fc7c629 [15000:6904:0407/193212.722:ERROR:device_event_log_impl.cc(214)] [19:32:12.722] USB: usb_device_handle_win.cc:1056 Failed to read descriptor from node connection: システムに接続されたデバイスが機能していません。 (0x1F) ---------------------- ----------------------

試したこと

・空白が多いからこのようになっているのだと仮定し、.replace()で空白の置き換えを試みた。
同様の事象らしきものが確認された記事を参考に以下のような、.textの取得の仕方を変えてみた。しかし、空文字で返ってきた。

python

1変更前 2#番号を取得 3max_num_comment = driver.find_element_by_xpath("//tbody/tr/td") 4max_num = max_num_comment.text 5max_num = max_num.replace(" ", "") 6print("----------------------") 7print(max_num_comment)#text 8print("----------------------") 9#print(max_num_comment) 10 11変更後 12#番号を取得 13max_num_comment = driver.find_element_by_xpath("//tbody/tr/td").get_attribute("textContent") 14print("----------------------") 15print(max_num_comment)#text 16print("----------------------") 17#print(max_num_comment)

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

pythonのバージョン:3.8.7
PCのOS:Windows10

以上です。
ご指導のほどよろしくお願いいたします。

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

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

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

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

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

otn

2021/04/07 12:00

> (上層は省略) tableタグ以下はどうなっていますか?
Yoshitsugu12

2021/04/07 15:17

更新しました! ご確認お願い致します。
Yoshitsugu12

2021/04/08 01:08

私が取得しようとしていた部分のxpathと全く同じxpathの個所が、ページの上に存在しているようです。 NGWさんからアドバイスをいただいて、試しにforで一覧を取得したところ、出力された1つ目のテキストが空文字だったのでそれが発覚しました。 xpathの問題が解決ししだい、結果をお伝えいたします。 そうなると、xpathの書き方に問題があるということになりますので、そちらを色々変えて試してみます!
guest

回答1

0

find_elements_by_xpathメソッドはリストを返すようです。
https://selenium-python.readthedocs.io/locating-elements.html#locating-by-xpath

取得した要素毎に中身を取り出してみたらどうでしょうか。
以下のようなイメージです。(未検証)

python

1 for max_num_comment in driver.find_elements_by_xpath("//tbody/tr/td"): 2 max_num = max_num_comment.text 3 max_num = max_num.replace(" ", "") 4 print("----------------------") 5 print(max_num_comment)#text 6 print("----------------------")

※余計な話ですが、私も開発しているときこういった勘違いがおきることは多々あります。(^^;)
デバッガをつかって検証しながら作る癖をつけると、リストが返ってきていることが見えて、こういったちょっとした部分は自己解決できるようになるかもしれません。
すくなくとも私はそういうふうに開発しています。

投稿2021/04/07 21:38

編集2021/04/08 14:07
NGW

総合スコア48

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

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

Yoshitsugu12

2021/04/08 01:04

ご意見誠にありがとうございます。 デバッガはあまり使いこなせていないので、頑張ります! ご指摘いただいたようにようにelementsで試すと一覧表示で取得できました!! そして、一覧で取得できたことで、空文字で取得された原因もわかりました。 どうやら、私が取得しようとしていた部分のxpathと全く同じxpathの個所が、ページの上に存在しているようです。 forで取得できた1つ目のテキストが空文字だったのでそれが発覚しました。 そうなると、xpathの書き方に問題があるということになりますので、そちらを色々変えて試してみます!
NGW

2021/04/08 01:13

直接の解決法ではなかったですが、参考となってよかったですw たしかにtbody,tr,tdだけだと汎用的な指定すぎて、目的の場所を特定するのは難しいかもしれませんね。 id属性などがあると特定しやすいですが、つくられたページの特徴をみて、いろいろよさそうなとり方を試していただけると良いかと思います。
otn

2021/04/08 12:02

回答のコードでは複数の"s"が付いてませんよ。
NGW

2021/04/08 14:07

ご指摘ありがとうございます。修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問