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

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

詳細はこちら
CSV

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

Python

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

Q&A

解決済

1回答

4717閲覧

Python3  WEBスクレイピングで抽出した値のCSV書込につきまして

windyno8

総合スコア12

CSV

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

Python

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

0グッド

1クリップ

投稿2018/09/23 23:47

編集2018/09/27 03:03

前提・実現したいこと

python3にてWEBスクレイピングをしたいと思い
トライをしています。
色々な数字データを集めてエクセルでグラフを作成したり
分析をしたいと考えています。
プログラム初心で色々と調べながらしていますが
どうしても上手くいかないところがありますので
ご教授頂けると助かります。よろしくお願いいたします。

発生している問題

print(a) で20個の数値が出ており、
そのままCSVファイルにセルA1;A20で
保存をしたいです。
どうしても1個の値、コンマが発生してしまい
上手く書き込めません。
お手数お掛け致しますがアドバイス頂けると助かります。

該当のソースコード

price = ''

import requests
import csv
from bs4 import BeautifulSoup

url = 'http://kakaku.com/kuruma/used/spec/Maker=1/Model=31773'
html = requests.get(url)

soup = BeautifulSoup(html.text,"html.parser")
span = soup.find_all("span",{"class":"price"})
for i in span:
a = (i.string)
print (a)

with open('some.csv', 'w') as f:
writer = csv.writer(f, lineterminator='\n')
writer.writerow(a)

**

price = '' import requests import csv from bs4 import BeautifulSoup url = 'http://kakaku.com/kuruma/used/spec/Maker=1/Model=31773' html = requests.get(url) soup = BeautifulSoup(html.text,"html.parser") span = soup.find_all("span",{"class":"price"}) for i in span: print(i.string) b =(i.string) a_list = [] for j in b: a_list.append(j) f = open('some.csv', 'w') writer = csv.writer(f) writer.writerow(a_list)

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

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

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

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

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

guest

回答1

0

ベストアンサー

aの型が文字列だからです。
floatにキャストしたうえで、リストに放り込むようにしてください。

Python

1>>> import csv 2>>> import sys 3>>> 4>>> writer = csv.writer(sys.stdout) 5>>> 6>>> _ = writer.writerow('123') 71,2,3 8>>> _ = writer.writerow(123) 9Traceback (most recent call last): 10 File "<stdin>", line 1, in <module> 11_csv.Error: iterable expected, not int 12>>> _ = writer.writerow([123]) 13123

なお、各行一つしかデータを置かないのであれば、csvモジュールの利用に拘る必要はありません

コメントを受けて

こんな感じで書けます。

Python

1a_list = [] 2for i in span[:-1]: 3 value = float(i.string) 4 a_list.append([value, ]) 5 6with open('some.csv', 'w') as fout: 7 writer = csv.writer(fout) 8 writer.writerows(a_list)

変更点:
0. spanではなくspan[:-1]を巡回
データ『応談』が邪魔なのでアドホックに対応。
0. i.stringをfloatにキャスト
数値は数値として扱うのがトラブルが少ないです。
ただし誤差が発生するので、どうしてもそれを避けたい場合は文字列でも良いです。
0. a_listにデータを加える際、要素数1のリストにした
csvとして扱う以上は、1レコードに与える内容はシーケンスにしないと。
0. a_listの作成を一つ目のループに移動
ループを分ける必要がないです。
0. with文の利用
一般的にリソースの開閉にはコンテキストマネージャを使うのが常道です。
0. writer.writerowではなくwriter.writerowsを利用
複数行書き込むので。

もう一度書きますが、
レコードの要素数が常に一つなのであれば、csvモジュールの利用に拘る理由は全く無いです。

コードの書き方について

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
Python
特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。

投稿2018/09/24 00:18

編集2018/09/27 03:58
LouiS0616

総合スコア35668

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

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

windyno8

2018/09/24 01:04

早速のアドバイスをありがとうございます。 岡崎図書館の件などのように迷惑がかからぬようアクセスは控えるように致します。 float にトライしてプリントをしてみると、値が20個から1個になってしまいました。 何か良いヒントがございましたら教えて頂けると助かります。 ----------------------------------------------- soup = BeautifulSoup(html.text,"html.parser") span = soup.find_all("span",{"class":"price"}) for i in span: a = float(i.string) print(a)
LouiS0616

2018/09/24 01:07 編集

おそらくfor文内で毎回aの値が書き換えられているので、 ・ リストにaを放り込んでいくか、 ・ for文内で書き込み処理を行うか、 どちらかの方法にしてください。 註:『おそらく』と書いたのは、インデントが崩れていてコードが多重解釈できるからです。
windyno8

2018/09/24 02:40

リストにaを放り込むことや、FOR内で書き込み処理を行うか 色々と勉強してみましたが答えにたどり着けておりません。もう少し解説頂けると幸いです。質問分の最下部にコード更新いたしました。
LouiS0616

2018/09/24 02:49

私の書いたコードはあくまでエラーの原因を説明するためのもので、コピーして転用できる類のものではありません。実際、csv.writer(sys.stdout) なんてデバッグ以外ではほぼ使いません。 コードは意味を理解したうえで書くようにしてください。スクレイピングに用いるなら特に。 --- a_list = [] とでもループ前に宣言しておいて、ループ内で a を append していけば良いです。 CSVファイルに書き出す際はa_list内の各要素にアクセスして出力していきます。 リストを作るのと、出力するのとで、それぞれ一回ずつループすることになります。 当然もっとスマートに書く方法もありますが、まずは自力で動かすところまで持っていかないと意味が無いです。
windyno8

2018/09/24 03:11

親身にご丁寧にありがとうございます。迷惑を掛けることは許されないのでコードの意味を理解してから書くようにします。ここまでヒント頂いたことで大分イメージは出来ました。結果はまた追って報告します。ありがとうございます。
windyno8

2018/09/27 03:08

こんにちは。あれからも勉強しながらコード作成しています。 ループ内で a を appendについてfor文を使用してトライしていますが soupで20個出した値に対し1個しか出力出来ておりません。 どこかヒントを再度頂けると幸いです。よろしくお願いいたします。
LouiS0616

2018/09/27 03:47

手元で試して見ましたが、some.csvの中身は『応,談』になりました。 windyno8さんの環境でも同じでしょうか?
windyno8

2018/09/28 01:40

LouiS0616 様  こんにちは。迅速で丁寧な解説を本当にありがとうございました。私の中では始めてのプログラミングで相当難易度が高く15時間以上かけて試行錯誤してきました。 [:-1] やシーケンスのための要素数1は色々調べましたが思いも付きませんでした、 途中挫折しそうになりましたが、何とか一つ目のプログラミングが出来上がりました。一つ一つのアドバイスが叱咤激励となりモチベーションを維持することが出来ました。 CSVファイルのほかにJSON式やSQLite3のデータベースがあることを知りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問