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

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

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

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

Python

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

Q&A

解決済

3回答

907閲覧

CSVのエラー・出力方法

kentaronagata

総合スコア25

CSV

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

Python

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

0グッド

0クリップ

投稿2021/12/02 09:11

現在Pythonで水道料金自動計算プログラムを作成しようと考えています。
まだまだ初心者なもので初手の方で躓いております。
浜松の水道代のサイトから基本料金が書かれているHTMLを抽出したものをcsvファイルに出力しようとした段階でエラーが出ました。

import requests from bs4 import BeautifulSoup import urllib import pandas as pd #浜松の水道代をサイトからスクレイピング hamamatsu_url = "https://www.city.hamamatsu.shizuoka.jp/service/suidou/service/hamayu.html" # サンプルページ html = requests.get(hamamatsu_url) soup = BeautifulSoup(html.content,"html.parser") #表のHTMLを抽出 basic_charge = soup.find(class_="datatable") #表の値をCSVに出力 for element in basic_charge(): table =element.text table.to_csv("水道料金_基本料金.csv") ここに言語を入力 ``` このプログラムを実行すると以下のエラーが出ます。 ``` runfile('/Users/kentaro/Desktop/PYTHON プログラム/水道代 計算プログラム/タイトル無し14.py', wdir='/Users/kentaro/Desktop/PYTHON プログラム/水道代 計算プログラム') Traceback (most recent call last): File "/var/folders/vg/1tr13rls67v4h6fmkdl8xbq40000gn/T/ipykernel_44887/4125468063.py", line 1, in <module> runfile('/Users/kentaro/Desktop/PYTHON プログラム/水道代 計算プログラム/タイトル無し14.py', wdir='/Users/kentaro/Desktop/PYTHON プログラム/水道代 計算プログラム') File "/Users/kentaro/opt/anaconda3/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_umd.py", line 167, in runfile execfile(filename, namespace) File "/Users/kentaro/opt/anaconda3/lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydev_imps/_pydev_execfile.py", line 25, in execfile exec(compile(contents + "\n", file, 'exec'), glob, loc) File "/Users/kentaro/Desktop/PYTHON プログラム/水道代 計算プログラム/タイトル無し14.py", line 25, in <module> table.to_csv("水道料金_基本料金.csv") AttributeError: 'str' object has no attribute 'to_csv' ``` エラーからして、テキストファイルで文字型になり、その文字型のテキストファイルをCSVに書き込もうとしたのでこのようなエラーが出てしまったということなのでしょうか? このエラーについてと、CSVへの出力方法を教えていただけたらと思います。 よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

HTMLの”datatable”をfindをfind.allで全て取得し、dfs[0]とdfs[1]を書き込むことで基本料金の表と従量料金の表をしれぞれ取得しCSVに書き込むことができました。

import requests from bs4 import BeautifulSoup import urllib import pandas as pd #浜松の水道代をサイトからスクレイピング hamamatsu_url = "https://www.city.hamamatsu.shizuoka.jp/service/suidou/service/hamayu.html" # サンプルページ html = requests.get(hamamatsu_url) soup = BeautifulSoup(html.content,"html.parser") #print(soup) #表のHTMLを抽出 basic_charge = soup.find_all(class_="datatable") #print(basic_charge()) #表の値をCSVに出力(テラテイル使用) #for element in basic_charge(): #table =element.text #table.to_csv("水道料金_基本料金.csv") dfs = pd.read_html(str(basic_charge)) print(dfs) dfs[0].to_csv('基本料金.csv') #従量料金の抽出 dfs[1].to_csv('従量料金.csv') コード

投稿2021/12/04 03:33

kentaronagata

総合スコア25

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

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

0

ベストアンサー

pandas.read_htmlに取得したHTMLコードを渡せばよいです。
なお、結果はリストで返ってくるので、先頭のデータフレームを取得してCSV出力できます。

Python

1import pandas as pd 2import requests 3from bs4 import BeautifulSoup 4 5hamamatsu_url = "https://www.city.hamamatsu.shizuoka.jp/service/suidou/service/hamayu.html" # サンプルページ 6html = requests.get(hamamatsu_url) 7soup = BeautifulSoup(html.content,"html.parser") 8 9#表のHTMLを抽出 10basic_charge = soup.find(class_="datatable") 11dfs = pd.read_html(str(basic_charge)) 12dfs[0].to_csv('ret.csv')

投稿2021/12/02 09:26

can110

総合スコア38341

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

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

kentaronagata

2021/12/02 15:24

csvとして抽出できました。 ありがとうございます。 dfs[0]の0はインデックスを表すと思うのですが、そこを1にすると、1番目からの表記がcsvに書き出されるのでしょうか?
can110

2021/12/02 23:16

渡したHTMLコードに複数のテーブルが含まれていればそうなると思いますが、今回の例ではひとつしか含まれていないようです。
kentaronagata

2021/12/04 03:26

HTMLの”datatable”をfindをfind.allで全て取得し、基本料金の表と従量料金の表をしれぞれ取得しCSVに書き込むときに、dfs[0]とdfs[1]を使い分けることができました。 ありがとうございます。
guest

0

こういう場合は、pandasのread_htmlを使うのが簡単です。

python

1>>> import pandas as pd 2>>> df_list = pd.read_html('https://www.city.hamamatsu.shizuoka.jp/service/suidou/service/hamayu.html') 3>>> 4>>> print(df_list[0]) 5 メーター口径 金額 60 13ミリメートル 66071 20ミリメートル 70482 25ミリメートル 79293 30ミリメートル 1,650104 40ミリメートル 3,190115 50ミリメートル 6,820126 75ミリメートル 15,400137 100ミリメートル 30,800148 125ミリメートル 30,800159 150ミリメートル 81,4001610 200ミリメートル以上 170,50017>>> print(df_list[1]) 18 使用水量 (立方メートル) 金額 190 10まで 44201 10超~20まで 10560212 20超~30まで 13970223 30超~40まで 17050234 40超~50まで 198245 50超~100まで 20680256 100超~500まで 21450267 500超~ 22027>>> print(df_list[2]) 28 金額 290 1,22130>>> print(df_list[3]) 31 排出量 (立方メートル) 金額 320 10まで 44331 10超~20まで 12870342 20超~30まで 15180353 30超~50まで 16720364 50超~100まで 18040375 100超~200まで 19360386 200超~500まで 20680397 500超~1,000まで 21450408 1,000超~2,000まで 22330419 2,000超~5,000まで 228804210 5,000超~ 23320

read_htmlの説明と、csvへの出力については、以下をお読みください。

Python, pandasでwebページの表(htmlのtable)をスクレイピング
pandasでcsvファイルの書き出し・追記(to_csv)

投稿2021/12/02 09:25

編集2021/12/02 09:26
ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問