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

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

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

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

Q&A

4回答

1014閲覧

Python テーブル スクレイピング

ikkun

総合スコア18

Python 3.x

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

0グッド

0クリップ

投稿2018/12/03 15:14

PC初心者です! 
よろしくお願いいたします。

https://ja.wikipedia.org/wiki/2000%E5%B9%B4%E3%82%B7%E3%83%89%E3%83%8B%E3%83%BC%E3%82%AA%E3%83%AA%E3%83%B3%E3%83%94%E3%83%83%E3%82%AF%E3%81%AE%E3%83%A1%E3%83%80%E3%83%AB%E5%8F%97%E8%B3%9E%E6%95%B0%E4%B8%80%E8%A6%A7

↑上のwikiのページから、各国のメダルの数を持ってきて、CSVに変換後、PCにdownloadしたいです。

import pandas as pd
from bs4 import BeautifulSoup
import requests

これらのツールを使ってのやり方を教えていただきたく思います!

今苦戦しているのは、
tableをスクレイピングする過程です。

import requests
url="https://ja.wikipedia.org/wiki/2000%E5%B9%B4%E3%82%B7%E3%83%89%E3%83%8B%E3%83%BC%E3%82%AA%E3%83%AA%E3%83%B3%E3%83%94%E3%83%83%E3%82%AF%E3%81%AE%E3%83%A1%E3%83%80%E3%83%AB%E5%8F%97%E8%B3%9E%E6%95%B0%E4%B8%80%E8%A6%A7"
response=requests.get(url).text

table = response.find("table",{"class":"wikitable sortable jquery-tablesorter"})[0]

ここでエラーがでて先に進めません。

他に手段があれば教えていただけると幸いです!

ぜひよろしくお願いいたします^^;

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

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

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

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

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

guest

回答4

0

https://sheet.new

Googleスプレッドシートを開き

A1に以下を入力

=IMPORTHTML("https://ja.wikipedia.org/wiki/2000%E5%B9%B4%E3%82%B7%E3%83%89%E3%83%8B%E3%83%BC%E3%82%AA%E3%83%AA%E3%83%B3%E3%83%94%E3%83%83%E3%82%AF%E3%81%AE%E3%83%A1%E3%83%80%E3%83%AB%E5%8F%97%E8%B3%9E%E6%95%B0%E4%B8%80%E8%A6%A7","table",2)

イメージ説明

ファイル保存
メニューの「ファイル」-「形式を指定してダウンロード」-「カンマ区切りの値」でCSVファイルを保存してください。

IMPORTHTML
HTML ページ内の表やリストからデータをインポートします。
https://support.google.com/docs/answer/3093339?hl=ja

投稿2018/12/14 00:00

barobaro

総合スコア1286

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

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

0

WindowsとExcelであればIEを開いてテーブルの上で右クリック
イメージ説明
「Export to Microsoft Excel」でExcelにインポートされますのであとはCSVに保存してください。

Webの表を取り込む
http://www.excel.studio-kazu.jp/mag2/backnumber/mm20041019.html

投稿2018/12/13 23:48

barobaro

総合スコア1286

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

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

0

table = response.find("table",{"class":"wikitable sortable jquery-tablesorter"})[0]

findをfind_allに変更するか、findでしたら[0]は不要です。
classがそのままだとどうも取得できないようなので'wikitable sortable'に変更してください。

あと
response=requests.get(url).text
よりも

response=requests.get(url).content
の方が文字化けしにくいです

https://orangain.hatenablog.com/entry/encoding-in-requests-and-beautiful-soup

※のURLとTABLEを変更すれば他にも転用できます。

python

1import csv 2 3from bs4 import BeautifulSoup 4import requests 5 6# ※URL 7url = 'https://ja.wikipedia.org/wiki/2000年シドニーオリンピックのメダル受賞数一覧' 8 9r = requests.get(url) 10 11soup = BeautifulSoup(r.content, 'html.parser') 12 13# タグ検索 14# find 先頭のひとつ 15# find_all 複数(リスト) 16 17# ※TABLEを指定 18table = soup.find('table', class_='wikitable sortable') 19 20result = [[td.get_text(strip=True) for td in trs.find_all(['th', 'td'])] 21 for trs in table.find_all('tr')] 22''' 23# CSSセレクタ 24# select_one 先頭のひとつ 25# select 複数(リスト) 26 27table = soup.select_one('table.wikitable.sortable') 28 29result = [[td.get_text(strip=True) for td in trs.select('th, td')] 30 for trs in table.select('tr')] 31''' 32 33# 取得テーブルデータ確認 34print(result) 35 36with open('result.csv', 'w') as fw: 37 writer = csv.writer(fw, dialect='excel', lineterminator='\n') 38 39 # テーブルを保存 40 writer.writerows(result)

投稿2018/12/04 01:11

barobaro

総合スコア1286

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

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

ikkun

2018/12/04 13:37

ご回答いただきありがとうございます!!! 最後の部分で苦戦しています。。 >>> with open('result.csv', 'w') as fw: writer = csv.writer(fw, dialect='excel', lineterminator='\n') >>> writer.writerows(result) Traceback (most recent call last): File "<pyshell#29>", line 1, in <module> writer.writerows(result) ValueError: I/O operation on closed file.
guest

0

こんにちは

以下でどうでしょう?

(teratail) [jun68ykt@mbp15 q161850]$ date

2018年 12月 4日 火曜日 05時16分53秒 JST
(teratail) [jun68ykt@mbp15 q161850]$ cat scraper.py

python3

1from bs4 import BeautifulSoup 2import requests 3 4TARGET_URL = 'https://ja.wikipedia.org/wiki/2000年シドニーオリンピックのメダル受賞数一覧' 5 6with open('Sydney_2000_Medals.csv', 'w', encoding='utf-8') as f: 7 soup = BeautifulSoup(requests.get(TARGET_URL).text, 'html.parser') 8 table = soup.select('table.wikitable.sortable')[0] 9 for row in table.find_all('tr'): 10 cells = [] 11 for cell in row.find_all(['td', 'th']): 12 cells.append(cell.get_text().strip()) 13 f.write("%s\n" % ','.join(cells))

(teratail) [jun68ykt@mbp15 q161850]$ python -V

Python 3.7.0
(teratail) [jun68ykt@mbp15 q161850]$ python scraper.py
(teratail) [jun68ykt@mbp15 q161850]$ ls -l Sydney_2000_Medals.csv
-rw-r--r-- 1 jun68ykt staff 2235 12 4 05:17 Sydney_2000_Medals.csv
(teratail) [jun68ykt@mbp15 q161850]$ head Sydney_2000_Medals.csv

csv

1順,国・地域,金,銀,銅,計 21,アメリカ合衆国,36,24,31,91 32,ロシア,32,28,29,89 43,中国,28,16,15,59 54,オーストラリア(開催国),16,25,17,58 65,ドイツ,13,17,26,56 76,フランス,13,14,11,38 87,イタリア,13,8,13,34 98,オランダ,12,9,4,25 109,キューバ,11,11,7,29

(teratail) [jun68ykt@mbp15 q161850]$ tail Sydney_2000_Medals.csv

csv

171,バルバドス,0,0,1,1 271,チリ,0,0,1,1 371,アイスランド,0,0,1,1 471,インド,0,0,1,1 571,イスラエル,0,0,1,1 671,クウェート,0,0,1,1 771,キルギス,0,0,1,1 871,マケドニア共和国,0,0,1,1 971,カタール,0,0,1,1 10合計,297,299,326,922

(teratail) [jun68ykt@mbp15 q161850]$

(使用PC: macbook pro, OS 10.12.6)

追記

Widows のデスクトップにCSVを出力させたいとのことですが、その場合は、上記の回答に書いたコードの以下の部分

python

1with open('Sydney_2000_Medals.csv', 'w', encoding='utf-8') as f:

で、オープンするファイルの文字列 'Sydney_2000_Medals.csv' の部分を、Windowsのデスクトップに作成したいファイルへの(絶対)パスを書けば良いです。

あいにく手元に Windows PCがないので試していませんが、

python

1with open(r'C:\Users\foo\Desktop\Sydney_2000_Medals.csv', 'w') as f:

のようにするとデスクトップに出力されるのではと思います。ただし上記で foo の部分は、ご自身のユーザー名に置き換えてください。

投稿2018/12/03 20:24

編集2018/12/09 13:22
jun68ykt

総合スコア9058

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

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

ikkun

2018/12/04 13:36

ご回答いただきありがとうございます! 原因が分かりませんが、以下のように数字のみが表示されました汗 どこが問題か教えていただけると幸いです >>> TARGET_URL = 'https://ja.wikipedia.org/wiki/2000年シドニーオリンピックのメダル受賞数一覧' >>> with open('Sydney_2000_Medals.csv', 'w', encoding='utf-8') as f: soup = BeautifulSoup(requests.get(TARGET_URL).text, 'html.parser') table = soup.select('table.wikitable.sortable')[0] for row in table.find_all('tr'): cells = [] for cell in row.find_all(['td', 'th']): cells.append(cell.get_text().strip()) f.write("%s\n" % ','.join(cells)) 2 7 9 11 13 15 2 10 13 16
jun68ykt

2018/12/04 21:53

エラーメッセージが表示されなかったのであれば正常に実行されていますので、python コマンドを実行したディレクトリ(フォルダ)に Sydney_2000_Medals.csv というファイルが出来ていないか、確認してください。それが出力結果のCSVファイルになります。
ikkun

2018/12/05 04:02

回答いただきありがとうございます!! コマンドを実行したフォルダはどのように確認できるのでしょうか? たびたび申し訳ありません汗
jun68ykt

2018/12/05 06:03

なるほど。逆に教えて欲しいのですが、最終的に欲しい CSV ファイルはどこに出来て欲しいですか? あと、お使いのPCは何なのか知りたいですね。Windows PCですか?
ikkun

2018/12/09 02:36

デスクトップに出来てほしいです。 Windows8 です。 よろしくお願いいたします。
jun68ykt

2018/12/09 10:33

回答に追記しましたので、ちょっと試したり調べたりしてみてください。
jun68ykt

2018/12/13 06:53

うまくいったでしょうか?参考になれば幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問