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

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

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

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

Python 3.x

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

Q&A

解決済

2回答

8042閲覧

スクレイピング結果をcsvに書き出したい

cir

総合スコア19

CSV

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

Python 3.x

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

0グッド

5クリップ

投稿2016/10/14 01:35

編集2016/10/14 09:01

###前提・実現したいこと
プログラミング初心者です。ご教授お願いします。
イオンネットスーパー(https://www.aeonnetshop.com/shop/r/r5603_n01050000001160_v80/)でのすべての野菜の商品名と値段のスクレイピング結果をcsvに書き出したい。

###発生している問題・エラーメッセージ
ホームページ上の80種の野菜のうち、80番目の野菜のみcsvに書き出すことができているが、他の79種の野菜の情報が書き出されない。

###該当のソースコード

Python

1import csv 2import requests 3from bs4 import BeautifulSoup 4 5food_html = requests.get('https://www.aeonnetshop.com/shop/genre/genre.aspx?genre=5603&shop=01050000001160&pps=80') 6soup = BeautifulSoup(food_html.text, "html.parser") 7soup.find(class_='pc2015-item-inner pc2015-for-member') 8 9for food in soup.findAll(class_='pc2015-item-inner pc2015-for-member'): 10 food.find(class_='pc2015-item-name').find('span').string + food.find(class_='pc2015-price-1').find('strong').contents[0] + food.find(class_='pc2015-price-2').find('strong').contents[0] 11 12header = ['name','price1','price2'] 13body = [ 14 [food.find(class_='pc2015-item-name').find('span').string,food.find(class_='pc2015-price-1').find('strong').contents[0],food.find(class_='pc2015-price-2').find('strong').contents[0]] 15 ] 16with open('food.csv', 'wt',newline='') as csvfile: 17 writer = csv.writer(csvfile) 18 writer.writerow(header) 19 writer.writerows(body) 20

###試したこと
for文(for food in soup.findAll(class_='pc2015-item-inner pc2015-for-member'):)はprintするとすべての情報を書き出すことができるのでfor文は間違ってはいないと思います。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答2

0

ベストアンサー

forループの前にCSVオープンにしておいて取得した結果を順次保存していくといいです。
CSSセレクタで指定するselect(複数)やselect_one(ひとつ)を使うとシンプルに書けますのでおすすめです。

python

1import csv 2import requests 3from bs4 import BeautifulSoup 4 5food_html = requests.get('https://www.aeonnetshop.com/shop/genre/genre.aspx?genre=5603&shop=01050000001160&pps=80') 6soup = BeautifulSoup(food_html.text, "html.parser") 7 8with open('food.csv', 'wt') as fw: 9 10 writer = csv.writer(fw, lineterminator='\n') 11 writer.writerow(['name', 'price1', 'price2']) 12 13 for i in soup.select('div.pc2015-memo-body > ul > li'): 14 15 name = i.select_one('a.pc2015-item-inner.pc2015-for-member > span.pc2015-item-name').get_text().strip() 16 17 price1 = ''.join(i.select_one('a.pc2015-item-inner.pc2015-for-member > span.pc2015-item-price > span.pc2015-price-1 > strong').get_text().split()) 18 price2 = i.select_one('a.pc2015-item-inner.pc2015-for-member > span.pc2015-item-price > span.pc2015-price-2 > strong').get_text().strip() 19 20 writer.writerow([name, price1, price2])

投稿2016/10/14 15:16

barobaro

総合スコア1286

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

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

cir

2016/10/15 04:07

select, select_oneをはじめて知りました。こういったやり方もあるのですね。 コードまで書いて下さり、ありがとうございます。
guest

0

for文のループが完了した段階でfoodに入っているのは最後の要素(80番目)になっているからじゃないでしょうか?

そしてのfood(最後の要素)を使ってbodyを組み立てているからだと思います。

投稿2016/10/14 14:58

hana-da

総合スコア1728

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

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

cir

2016/10/15 03:36 編集

csvに書き出す時点で、for文が完了してるということですね。やっと理解できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問