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

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

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

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

Webサイト

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

Q&A

解決済

1回答

1615閲覧

WEBスクレイピングして入手した数値の出力結果が0となる

HiroMura

総合スコア2

Python 3.x

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

Webサイト

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

0グッド

1クリップ

投稿2020/12/01 05:12

WEBスクレイピングして入手した数値の出力結果が0となる

定期的に通信速度を調査しようと、通信速度測定サイトのスクレイピングを試みましたが、
HTML上では数値が入っているもののスクレイピングした出力結果が0となってしまいます。

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

HTMLの記述のうち、以下であれば3を出力したいと考えましたが以下の出力結果となります。
<span class="extra-measurement-value-container succeeded" id="latency-value">3</span> ==$0

0 0 0

該当のソースコード

python

1import time 2import requests 3from selenium import webdriver 4from bs4 import BeautifulSoup 5from time import sleep 6 7url = 'https://fast.com/ja/' 8driver = webdriver.Chrome() 9driver.get(url) 10time.sleep(30) 11driver.find_element_by_id('show-more-details-link').click() 12time.sleep(30) 13html = requests.get(url) 14soup = BeautifulSoup(html.text, 'html.parser') 15 16latency = soup.find('span', id ='latency-value') 17bufferbloat = soup.find('span', id ='bufferbloat-value') 18upload = soup.find('span', id ='upload-value') 19 20print(latency.string) 21print(bufferbloat.string) 22print(upload.string)

試したこと

==$0とHTMLに記述がある(以下補足に記載)のでそれが原因かと思い調べましたが
原因とは異なるようでした。(または理解出来ませんでした)

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

このコードでは、確実に0しか取れないのではないでしょうか。

理由

実装では、

  1. Seleniumでアクセス
  2. スピードテストの結果を待つ
  3. 詳細を表示する
  4. requestsで再度アクセス
  5. requestsの結果をパース

となっています。

Selenium側で行ったスピードテストを一切利用せずに、新しくrequestsでリクエストをしているように見えます。
この場合、当然ながらrequests側のレスポンスはテスト前の状態です。

どうするか

無理にBeautifulSoupに渡そうとせずに、全部Seleniumでやったほうが楽な気がします。

例: (動作は未確認)

time.sleep(30) latency = driver.find_element_by_id('latency-value').text bufferbloat = driver.find_element_by_id('bufferbloat-value').text upload = driver.find_element_by_id('upload-value').text print(latency) print(bufferbloat) print(upload)

もし、どうしてもBeautifulSoupでパースしたいのであれば、
requestsで取り直すのではなく現時点でSelenium側が持っているコンテンツを渡す必要があります。

例: (動作は未確認)

python

1# 2度目のsleep以降 2soup = BeautifulSoup(driver.page_resource, 'html.parser') 3 4latency = soup.find('span', id ='latency-value') 5bufferbloat = soup.find('span', id ='bufferbloat-value') 6upload = soup.find('span', id ='upload-value') 7 8print(latency.string) 9print(bufferbloat.string) 10print(upload.string)

補足

==$0とHTMLに記述がある(以下補足に記載)のでそれが原因かと思い調べましたが
原因とは異なるようでした。(または理解出来ませんでした)

確認のために、Chromeの開発者ツールなどで見ていると思うのですが、
== $0は開発者ツール側で出している項目(何かは知らない)なので、
今回の件とは無関係です。

投稿2020/12/01 05:44

attakei

総合スコア2738

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

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

HiroMura

2020/12/01 05:58

ご丁寧にありがとうございます。 実装の流れを記載頂き、とてもすっきりと理解することが出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問