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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

Q&A

解決済

1回答

470閲覧

WEBページからテーブルデータを取得したい

nyaaa6

総合スコア21

スクレイピング

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

0グッド

0クリップ

投稿2019/02/28 02:11

編集2019/02/28 02:14

前提・実現したいこと

【WEBページからテーブルデータを取得したい】

当方ドットインストールpythonコース受講中のプログラミング素人です。
https://www.chatzone.jp/
↑このサイトのテーブルデータを取得する為に
https://note.mu/daikawai/n/nc73889d6d835
↑このサイトを参考にコピペしながら書きました。
CSV出力までは出来ましたが、出力されたデータに問題がありました。

~~~~
02/24/2019(日)
32位
5:52
0:00
5:51
99.7%
~~~~

↑6種類ずつのデータが並んであるのですが、
これが全て一つのセルにまとめられております。
出力する際に、分けて出力したいのですが、出来ません。

該当のソースコード

from bs4 import BeautifulSoup
import requests
import pandas as pd
from google.colab import files

html_doc = requests.get('https://www.chatzone.jp/pc/performer/dmm-acha/806438.html').text
soup = BeautifulSoup(html_doc, 'html.parser')

tags = soup.find_all('tr',{'class':'history_row_time 2019_02'})

for tag in tags:
print(tag.getText())

columns = ["a"]
df2 = pd.DataFrame(columns=columns)

for tag in tags:
a = tag.getText()
se = pd.Series([a], columns)
print(se)
df2 = df2.append(se, columns)

filename = "result.csv"
df2.to_csv(filename, encoding = 'utf-8-sig')
files.download(filename)

試したこと

a = tag.getText()
↑ここを
a = tag.getText()
b = tag.getText()
c = tag.getText()
d = tag.getText()
e = tag.getText()

↑こんな風に書いてみましたが、当然出力される列が複製されるだけでした。
同じ<td>タグで囲まれたデータをどのように分類すればいいのかがわかりません。

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

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

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

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

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

tiitoi

2019/02/28 02:19

質問欄を編集して、コードの記述に markdown 記法を使ってください。
guest

回答1

0

ベストアンサー

ポイント

1 文字化けしないように requests.get() の返り値は .text ではなく、バイト列 .content を渡す。

2 .stripped_strings であるタグの子要素のテキストの一覧を取得できる。

  • stripped とあるように空白は除いてくれる
  • ジェネレーターなので、list(tag.stripped_strings) として、リストに変換する。

3 csv の書き込みは csv モジュールを使う。(pandas を使うほどのことではないため)

Python - CSV の読み込み/書き込み まとめ

サンプルコード

python

1import csv 2 3import requests 4from bs4 import BeautifulSoup 5 6# HTML を取得する。 7res = requests.get( 8 'https://www.chatzone.jp/pc/performer/dmm-acha/806438.html') 9soup = BeautifulSoup(res.content, 'lxml') 10 11# データを抽出する。 12data = [] 13for tag in soup.find_all('tr', class_='history_row_time 2019_02'): 14 data.append(list(tag.stripped_strings)) 15 16# CSV に書き込む。 17header = ['日付', 'サイト内順位', 'ログイン時間', 18 '2ショットチャット時間', 'パーティチャット時間', 'チャット率'] 19with open('output.csv', 'w', newline='') as f: 20 writer = csv.writer(f) 21 writer.writerow(header) 22 writer.writerows(data)
日付,サイト内順位,ログイン時間,2ショットチャット時間,パーティチャット時間,チャット率 02/28/2019(木),-,1:40,0:00,1:38,98.0% 02/27/2019(水),116位,4:31,0:03,3:04,69.0% 02/26/2019(火),-,0:00,0:00,0:00,0.0% 02/25/2019(月),-,0:00,0:00,0:00,0.0% 02/24/2019(日),32位,5:52,0:00,5:51,99.7% 02/23/2019(土),153位,3:46,0:32,2:33,81.9% 02/22/2019(金),48位,5:08,1:30,2:43,82.1% 02/21/2019(木),232位,3:27,0:57,0:58,55.6%

投稿2019/02/28 02:40

編集2019/02/28 02:41
tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問