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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

selenium

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

Q&A

解決済

1回答

1598閲覧

リンク先のサイト内の要素を取得したい

onioonioonio

総合スコア25

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

selenium

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

0グッド

0クリップ

投稿2020/11/06 22:31

前提・実現したいこと

リンク先サイトにあるテーブル内の要素を取得しようとしていますが、取得することができません。
できればテーブル内の要素を全て取得してクリップボードにコピーしたいです。

リンク先:https://www.ebay.com/itm//303727388384

該当のコードを実行中に以下のエラーメッセージが発生しました。

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

エラーメッセージ NoSuchElementException Traceback (most recent call last) <ipython-input-2-99df50474d8a> in <module> 24 25 #Brandを取得 ---> 26 Brand = driver.find_element_by_xpath('//*[@id="ds_div"]/div/section[3]/div/div/table/tbody/tr[1]/td[2]').text 27 print(Brand)

該当のソースコード

Python,Selenium

#ターゲットURL ebayURL = "https://www.ebay.com/itm//303727388384" from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.ui import Select from selenium.common.exceptions import NoSuchElementException import time import pyperclip options = webdriver.ChromeOptions() driver = webdriver.Chrome(executable_path=r"/Applications/chromedriver",options=options) driver.implicitly_wait(30) # ウィンドウを最大化 driver.maximize_window() # 新しいタブでURLアクセス driver.get(ebayURL) #Brandを取得 Brand = driver.find_element_by_xpath('//*[@id="ds_div"]/div/section[3]/div/div/table/tbody/tr[1]/td[2]').text print(Brand)

試したこと

driver.find_element_by_xpathをidやclass等に変更してみましたが、
取得できませんでした。
その他にも、beautiful soup,pandasなども試してみましたが、取得したい
要素は取得できませんでした。

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

Google Chrome 86.0.4240.183
Python 3.6.5
selenium
jupyter notebook

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

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

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

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

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

guest

回答1

0

ベストアンサー

目的の要素は、ページ内のiframe要素内の対象になっている様です。
seleniumではiframeで埋め込まれたページを参照するにはswitch_to.frame()とし
指定したフレームを対象としてあげる必要があります。

python

1driver.get(ebayURL) 2driver.switch_to.frame(driver.find_element_by_id('desc_ifr'))

またtable内のデータはBeautifulSoupを使用すると抽出が楽そうな気がします。
.page_sourceで現在driverで対象となっているフレームのソースを取得する事が出来ます。

python

1from bs4 import BeautifulSoup 2 3soup = BeautifulSoup(driver.page_source, 'html.parser') 4table = soup.find('div', class_='description').find('table').find('tbody')

あとはご自身でtrの中身を取得していき、ご自身で希望の形に整形してください。

python

1for tr in table.find_all('tr'): 2 title, content = [td.text for td in tr.find_all('td')]

データのクリップボードへの渡し方は以下となります。

python

1# win32clipboardを使用する場合(pip install pywin32) 2import win32clipboard 3def set_clipboard(txt): 4 win32clipboard.OpenClipboard() 5 win32clipboard.EmptyClipboard() 6 win32clipboard.SetClipboardText(txt, win32clipboard.CF_TEXT) 7 win32clipboard.CloseClipboard() 8 9set_clipboard('クリップボードに格納したい文字列') 10 11# pyperclipを使用する場合(pip install pyperclip) 12import pyperclip 13pyperclip.copy('クリップボードに格納したい文字列') 14

補足:
これらの手法の場合、クリップボードに格納できる要素数は1つだけです。
(リストの様な複数の要素を持つデータはクリップボードへの格納が出来ません。)
例えば複数のデータをクリップボードに格納し、手動でExcelに貼り付けたい等といった場合には
セルとセルの間は\tで区切り、次の行へと改行する際には\r\nと区切ってあげ
データを整形してあげる事で貼り付けした際に正しい形でExcelに貼り付ける等が可能です。
例:pyperclip.copy('A1データ\tB1データ\tここで次の行\r\nA2データ\tB2データ\r\n\r\nA4データ')

A列B列C列
A1データB1データここで次の行
A2データB2データ
 
A4データ

またExcel用のライブラリもある為、上記の様な動作を行いたいという場合には
クリップボードを操作するのではなく専用のライブラリを使用する事もおすすめします。

投稿2020/11/08 04:30

nto

総合スコア1438

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

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

onioonioonio

2020/11/08 05:07

ご回答ありがとうございます! フレームをスイッチしないと取得できないところまでは分かったのですが、クリップボードへの渡し方がわからなかったので、とても参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問