🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

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

Q&A

解決済

2回答

2807閲覧

(WEB)htmlのなかのJavaの内容をスクレイピングしたい

HiroMura

総合スコア2

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

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

0グッド

0クリップ

投稿2020/12/14 12:48

前提・実現したいこと

WEBページのグラフの数値と時間を1日おきに収集するプログラムを作りたいと考えています。
具体的には以下のソース(「発生している問題」に記載)におけるx(時間)とy(数値)を取得したいと考えています。

■WEBページ
https://downdetector.jp/shougai/twitter/

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

HTMLの中で時間と数値のセットを見つけたのですが、
パースさせる方法がわかりません。

■HTML内容 ***略*** <canvas id="holder"></canvas> <script type="text/javascript"> var data = { status: 'danger', max_baseline: 9, min_baseline: 2, communicate: null, company: 'Twitter', max: 96, series: { reports: { label: translated_reports, data: [ { x: '2020-12-13T12:05:27+00:00', y: 3 }, { x: '2020-12-13T12:20:27+00:00', y: 4 }, { x: '2020-12-13T12:35:27+00:00', y: 6 }, { x: '2020-12-13T12:50:27+00:00', y: 6 }, { x: '2020-12-13T13:05:27+00:00', y: 8 }, { x: '2020-12-13T13:20:27+00:00', y: 3 }, { x: '2020-12-13T13:35:27+00:00', y: 4 }, ***略***

該当のソースコード

python

1import requests 2from bs4 import BeautifulSoup 3import re 4from time import sleep 5 6url_twitter = 'https://downdetector.jp/shougai/twitter/' 7res_twitter = requests.get(url_twitter) 8soup_twitter = BeautifulSoup(res_twitter.text, "html.parser") 9 10print(soup_twitter)

試したこと

BeautifulSoupで取得した情報をテキスト編集(正規表現などを利用し)しうまく抜き出せるか、
また該当ホームページの上位ディレクトリ(大本のページ)のソースが以下のようになっていたので、
数値だけでも取り出せるか試しましたが(Xpathをコピーして指定出来るか等)うまくいきませんでした。

<h5>Twitter</h5> <svg class="danger sparkline" data-id="33459" data-values="[3, 4, 6, 6, 8, 3, 4, 3, 2, 8, 3, 8, 10, 1, 7, 4, 3, 2, 6, 4, 6, 1, 2, 3, 1, 5, 1, 1, 2, 1, 1, 0, 1, 0, 3, 1, 3, 2, 1, 1, 3, 3, 7, 4, 4, 13, 7, 5, 8, 6, 2, 5, 3, 5, 2, 1, 4, 7, 5, 2, 1, 4, 6, 4, 3, 2, 5, 4, 2, 2, 5, 3, 2, 5, 4, 5, 8, 2, 3, 2, 8, 6, 1, 4, 5, 5, 1, 2, 4, 4, 10, 10, 6, 8, 5, 96]" height="40" id="sparkline-33459" stroke-width="2"></svg>

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

Jupyter lab

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

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

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

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

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

guest

回答2

0

ベストアンサー

多少強引なやり方になってしまう気がしますが
まずは以下で対象にアクセスができます。
中身を.stringで取得してあげればよいです。
あとは正規表現で抜き出せるかと思います。

もしくはデータ自体を整形すれば辞書型にも変換出来るかもしれませんが
いかんせん元がjsonではない為キー部分がクォーテーションで囲まれておらず加工整形がめんどくさそうです。

python

1target = soup_twitter.find('script', text=re.compile(r'var data = ')) 2script = target.string 3text = script.split('$')[0] 4for m in re.finditer(r'{.+}', text): 5 print(m.group())

投稿2020/12/15 08:39

編集2020/12/15 10:21
nto

総合スコア1438

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

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

HiroMura

2020/12/15 10:14

回答ありがとうございます。 .stringで取得というのは、.textで文字列に変換という意味でしょうか。 targetで該当部のHTMLを取得は出来ているのですが(ありがとうございます!)、 scriptをprintで出力すると空になってしまっており、その後の正規表現まで辿り着くことが出来ませんでした。。
nto

2020/12/15 10:20

stringを使用すると回答をしておきながら、提示したコードが.textになってしまっておりました。 ただいま修正を致しましたので、改めて.stringにてお試しいただけますでしょうか。
HiroMura

2020/12/15 12:08

こちらこそ理解力が低くてすいません。無事に出力出来ました。 あとはテキスト編集(正規表現)で思うように整形していきます、ありがとうございました!
guest

0

https://stackoverflow.com/questions/14848503/how-to-get-the-data-value-of-svg-path
とかみるとattr(‘data-values’)で取れそうですね

SVGからでなくjavascriptの変数にもアクセスできそうだけど、JS詳しくないのでアクセスできるスコープにあるのか試してみないとわかりません。

投稿2020/12/14 23:57

rysh

総合スコア874

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

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

HiroMura

2020/12/15 08:46

ありがとうございます、試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問