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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Beautiful Soup

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

selenium

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

Q&A

2回答

8558閲覧

selenium、画面の読み込みが遅いサイトの場合、取得ができない

ninginnn

総合スコア35

Beautiful Soup

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

selenium

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

0グッド

0クリップ

投稿2020/03/29 01:18

seleniumを使い、xpathを利用して、スクレイピングを行なっていました。
driver.find_elements_by_xpath("~~~")
上記のようなコードでスクレイピングを行なっていたのですが、画面の読み込みが遅いサイトの場合、サイトが読み込まれていない部分が取得ができない。という事態が発生してしまいました。

このサイトで行なっていたのですが、私のwifiのせいかどんどん上から表示されていく。という形のようです。したがって表示されていない部分はxpathの取得要素の中に入っていませんでした。

そこで質問なのですが、xpathを利用して、このようなサイトで全ての要素を取得する方法はありますでしょうか?

色々調べたのですが、サイトの都合上以下のやり方では出来ませんでした。

html = urllib2.urlopen(url) dom = lxml.html.fromstring(html.read()) for o2 in dom.xpath(u"//a[text()='xxx']/@href"): bbb.append(o2)

以下は、実際のスクレイピングのコードです。

from selenium import webdriver import chromedriver_binary URL = "https://komyojikyozo.web.fc2.com/dnskv/dn01/dn01c01.htm" TIMEOUT = 10 driver = webdriver.Chrome() driver.implicitly_wait(TIMEOUT) driver.get(URL) frame = driver.find_element_by_name("frSheet") driver.switch_to.frame(frame) elems = driver.find_elements_by_xpath("(//tr[preceding-sibling::*[1][td/font[contains(text(),'訳文')]]])") for i in range(len(elems)): print(elems[i].text)

出力

かの阿羅漢にして正等覚者(ブッダ)たる世尊に礼拝いたします 『長部〔経典〕』 「戒蘊篇」なる聖典 「梵網経」(『長部』1) 【遍歴行者の物語】 このように私は聞いた。

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

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

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

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

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

guest

回答2

0

implicitly_waitを指定していることが原因です。
要するにelements_by_xpathには10秒以内に表示できたものしか入りません。

sleepを入れてやるかwebdriverwaitで処理するといいと思います。
presence_of_all_elements_locatedと言うのを指定してやると良いでしょう。

このくらいのページだったらネット環境の改善を真っ先に優先すべきかとは思いますが。。。

投稿2020/04/02 14:55

shirai

総合スコア1289

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

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

ninginnn

2020/04/03 06:41

なるほど!ありがとうございます。 色々と勉強になりました。 presence_of_all_elements_locatedを指定することで、ページが読み込まれるまで待っていてくれる。 implicitly_waitについても理解できました。 ありがとうございます。
guest

0

ページソースを見たら軽そうなページが見つかったのでURLを書き換えました。
find_elementsで取得したelmsはforに組み込むだけで直接個々のelementを取り出せます。

Sample

Python

1from selenium import webdriver 2from webdriver_manager.chrome import ChromeDriverManager 3 4URL = "https://komyojikyozo.web.fc2.com/dnskv/dn01/dn01c01.files/sheet001.htm" 5TIMEOUT = 10 6driver = webdriver.Chrome(ChromeDriverManager().install()) 7driver.implicitly_wait(TIMEOUT) 8driver.get(URL) 9 10frame = driver.find_elements_by_name("frSheet") 11if frame: 12 driver.switch_to.frame(frame[0]) 13 14elems = driver.find_elements_by_xpath("(//tr[preceding-sibling::*[1][td/font[contains(text(),'訳文')]]])") 15 16for elm in elems: 17 print(elm.text)

Output

txt

1かの阿羅漢にして正等覚者(ブッダ)たる世尊に礼拝いたします 2『長部〔経典〕』 3「戒蘊篇」なる聖典 4(中略) 5『かくゆえに、これは真実である。かくゆえに、これは如実である。そしてこれ(この見解)は我々にある、そしてまたこれ(この見解)は我々に存在する』と。 6

追記

このようなサイトで全ての要素を取得する方法はありますでしょうか?

例えばfind_elementsで要素を一度取得して、3秒後に再取得、
前後で取得されたelement数に違いがないか比較して判断することもできそうです。

投稿2020/03/29 02:05

編集2020/03/29 02:17
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ninginnn

2020/04/03 06:42

ありがとうございますm(__)m 追記のやり方は思い浮かびませんでした。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問