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

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

詳細はこちら
Python

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

HTML

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

Q&A

解決済

3回答

2528閲覧

PythonでIFRAMEタグの中身をスクレイピングしたい

sodiumplus3

総合スコア71

Python

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

HTML

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

0グッド

0クリップ

投稿2019/09/26 12:27

###スクレイピングしたい
研究のため、ある河川の水質データを利用したく、http://163.49.30.82/cgi-bin/DspWquaData.exe?KIND=5&ID=405071285512040&BGNDATE=20190920&ENDDATE=20190926&KAWABOU=NOの表の数値をスクレイピングしたく思っています。
requestsbs4を利用して、中身を見てみたところ、<IFRAME>タグの中のsrcで指定されたパス?に数値が入っているようです。
その中身をスクレイピングして取得することはできますか?
やり方を教えていただきたいです。

現在のコード↓

python

1import requests 2from bs4 import BeautifulSoup 3 4web = requests.get('http://163.49.30.82/cgi-bin/DspWquaData.exe?KIND=5&ID=405071285512040&BGNDATE=20190920&ENDDATE=20190926&KAWABOU=NO') 5 6# print(web.headers) 7print(web.encoding) 8# print(web.content) 9 10soup = BeautifulSoup(web.content,'html.parser') 11print(web.content.decode('EUC-JP'))

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

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

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

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

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

guest

回答3

0

上のフロッピーディスクの画像のリンクにCSVデータがありますのでそちらから解析された方がいいと思います。

CSVデータURLを取得

python

1import requests 2from urllib.parse import urljoin 3from bs4 import BeautifulSoup 4import datetime 5 6url = 'http://163.49.30.82/cgi-bin/DspWquaData.exe?KIND=5&ID=405071285512040&BGNDATE=20190920&ENDDATE=20190926&KAWABOU=NO' 7 8r = requests.get(url) 9 10if r.status_code == requests.codes.ok: 11 12 soup = BeautifulSoup(r.content, 'html.parser') 13 14 # ページからデータのリンク先URLを取得 15 link = urljoin(url, soup.select_one('body > center > p > a').get('href')) 16 print(link)

CSVをDataFrameに変換

python

1import pandas as pd 2 3df = pd.read_csv( 4 link, 5 skiprows = 9, 6 encoding = "shift_jis", 7 names=["年月日", "時分", "採水位置", "水温", "pH", "DO", "導電率", "濁度", "COD", "シアンイオン", "アンモニアイオン", "塩化物イオン", "BOD", "塩分濃度", "水位"], 8 parse_dates=["年月日"], 9)

年月日、時分から日時に変換

python

1import datetime 2 3def str2time(temp): 4 H, M = map(int, temp.split(':')) 5 return datetime.timedelta(hours=H, minutes=M) 6 7df['日時'] = df['年月日'] + df['時分'].apply(str2time) 8df.set_index('日時', inplace=True)

年月日、時分を除外

python

1df1 = df.loc[:,["採水位置", "水温", "pH", "DO", "導電率", "濁度", "COD", "シアンイオン", "アンモニアイオン", "塩化物イオン", "BOD", "塩分濃度", "水位"]] 2 3print(df1)

投稿2019/09/26 14:04

barobaro

総合スコア1286

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

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

sodiumplus3

2019/09/26 15:24

本当ですね!丁寧にありがとうございます。そちらの方法で進めていきたいと思います。 後学のために、もし質問の方法がお分かりでしたら補足などしていただけると幸いです。
guest

0

ベストアンサー

これだけは覚えておきたい!絶対パスと相対パスの違いとは【初心者向け】
https://techacademy.jp/magazine/5801

スクレイピングは相手に迷惑がかかるので一度本等を読んで基本を勉強されてからされるほうがよいかと思います。

Pythonクローリング&スクレイピング[増補改訂版]―データ収集・解析のための実践開発ガイドー
https://gihyo.jp/book/2019/978-4-297-10738-3

python

1import requests 2from urllib.parse import urljoin 3from bs4 import BeautifulSoup 4 5def get_data(url): 6 7 r = requests.get(url) 8 9 soup = BeautifulSoup(r.content, 'html.parser') 10 11 result = [[td.get_text() for td in tr.select("th, td")] for tr in soup.select('table[border="1"] > tbody > tr')] 12 13 return result 14 15 16if __name__ == "__main__": 17 18 url = 'http://163.49.30.82/cgi-bin/DspWquaData.exe?KIND=5&ID=405071285512040&BGNDATE=20190920&ENDDATE=20190926&KAWABOU=NO' 19 20 r = requests.get(url) 21 22 if r.status_code == requests.codes.ok: 23 24 soup = BeautifulSoup(r.content, 'html.parser') 25 26 # ページからURLを取得、結合 27 link = urljoin(url, soup.select_one('body > center > p > iframe').get('src')) 28 29 print(link) 30 31 result = get_data(link) 32 33 print(result)

投稿2019/09/27 02:31

barobaro

総合スコア1286

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

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

0

srcのパスをクリックするとページが表示されますね。
そのページのURLをコピーしてそのページをスクレイピングしてみましょう。

  • IFRAMEタグに記載のパスと開いたあとにブラウザのURL欄に記載のURLは少し違うはずです。

投稿2019/09/26 12:38

qax

総合スコア622

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

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

sodiumplus3

2019/09/26 12:44

回答ありがとうございます。 srcのパスの記述が`"/html/frm/WQuaAutoData2019092621214325756.html"`で特にクリックなどしてもページは表示されないのですが、どうすればよいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問