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

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

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

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

Q&A

解決済

3回答

1208閲覧

BeautifulSoupを使ったスクレイピングについて

Kaikoko

総合スコア14

Python

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

0グッド

0クリップ

投稿2020/02/03 03:37

pythonでBeautifulSoupを使ってスクレイピングの練習をしています。

今月のビットコインの価格を取得したくて
https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20200101&end=20200203

こちらのサイトのHistorical data for BitcoinのDate,Open*,High,Low,Close**,Volume,Market Capのデータを取得したいと思っています。

途中まではスクレイピングできるのですが途中でエラーがでてしまいます。

python

1import requests 2from bs4 import BeautifulSoup 3 4url = 'https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20200101&end=20200203' 5res = requests.get(url) 6soup = BeautifulSoup(res.text, "html.parser") 7 8elems = soup.find_all("table") 9 10date_td = soup.find_all('td', class_='cmc-table__cell cmc-table__cell--sticky cmc-table__cell--left') 11date_div = date_td.find_all('div', class_='')

最初にtableを探してtableの中のtd(cmc-table__cell cmc-table__cell--sticky cmc-table__cell--left)を抽出、divの中が空なのでclass_=''と書いたのですがエラーがでてしまいます。

なぜエラーが出るのか分かりません。
何卒よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

こんなことがしたいですか?

> date_td[0].string 'Feb 02, 2020' > for dt in date_td: > print(dt.string) Feb 02, 2020 Feb 01, 2020 Jan 31, 2020 Jan 30, 2020 Jan 29, 2020 Jan 28, 2020 Jan 27, 2020 Jan 26, 2020 Jan 25, 2020

投稿2020/02/03 04:17

technocore

総合スコア7200

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

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

Kaikoko

2020/02/03 04:19

ありがとうございます。やりたい事はDate毎にCSVに入れたいと思っています。 ですので取得したいデータは以下のようなイメージです。 Date Open* High Low Close** Volume Market Cap Feb 02, 2020 9,389.82 9,468.80 9,217.82 9,344.37 30,835,736,946 170,034,976,662 Feb 01, 2020 9,346.36 9,439.32 9,313.24 9,392.88 25,922,656,496 170,900,662,180 Jan 31, 2020...
technocore

2020/02/03 04:25

私の回答を参考にして金額も取り出して、日付と合わせてcsvファイルに出力すればいいです。 pythonでcsvを扱うにはCSVモジュールがおすすめです。 使い方はググってみてください。 $ pip search csv csv (1.0) Fast CSV Parser for Python
Kaikoko

2020/02/03 04:52

ありがとうございます! 挑戦してみます!!
guest

0

ベストアンサー

tableの行(row)を全て読み込んで
1行ずつ、そのなかのtdを取り出す二重ループにしてみました。
もっとスマートな方法があるかもしれませんが、参考にしてください。

rows = soup.find_all(class_="cmc-table-row") for row in rows: for td in row: print(td.string, " ", end="") print('') ------------------------ Feb 02, 2020 9,389.82 9,468.80 9,217.82 9,344.37 30,835,736,946 170,034,976,662 Feb 01, 2020 9,346.36 9,439.32 9,313.24 9,392.88 25,922,656,496 170,900,662,180 Jan 31, 2020 9,508.31 9,521.71 9,230.78 9,350.53 29,432,489,719 170,112,778,161 Jan 30, 2020 9,316.02 9,553.13 9,230.90 9,508.99 32,378,792,851 172,978,577,931 Jan 29, 2020 9,357.47 9,406.43 9,269.47 9,316.63 30,682,598,115 169,460,984,603

投稿2020/02/03 05:10

technocore

総合スコア7200

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

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

Kaikoko

2020/02/03 07:15

ありがとうございます! 書いていただいた内容にこちらを追加したらCSVに追加できるようになりました! 感謝です。 for row in rows: csvRow = [] for cell in row.findAll(['td', 'th']): csvRow.append(cell.get_text()) writer.writerow(csvRow)
guest

0

最初にtableを探してtableの中のtd(cmc-tablecell cmc-tablecell--sticky cmc-table__cell--left)を抽出、divの中が空なのでclass_=''と書いたのですがエラーがでてしまいます。

エラー内容を記載した方がいいと思います。

以下のエラー内容かと思いますが、

ResultSet object has no attribute 'find_all'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?

恐らくdate_tdの型が、「<class 'bs4.element.ResultSet'>」で配列なので、エラーになったかと。

投稿2020/02/03 04:17

meshi_s

総合スコア276

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問