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

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

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

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

Python 3.x

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

1回答

2593閲覧

Python ループ処理の結果をCSVとして一括で出したい

kentahi

総合スコア6

CSV

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

Python 3.x

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

1グッド

1クリップ

投稿2020/03/12 02:41

編集2020/03/12 04:34

前提・実現したいこと

自社のサイトをスクレイピングして
結果自体はPrint()で出たのですが、
それをCSVとして書き出したいです
※途中まで成功しても、その結果はCSVとして保存したいです

発生している問題・エラーメッセージ

① 一つしか結果が保存されない
② 途中で失敗した場合、保存されない

 OS Errorも時々発生

該当のソースコード

Python

1import requests 2import pandas as pd 3from bs4 import BeautifulSoup 4cluster=["URL","Info"] #列として認識したいけど認識されてない。。。 5 6L = [ "4710118896","4710118904","4710118920","4710118938","4710118953","4710118870" ] 7#ただ単のURL末尾 8 9for x in L : 10 url = 'http://〇〇〇〇.jp/〇〇〇〇〇/{}'.format(x) 11 req = requests.get(url) 12 soup = BeautifulSoup(req.content, "html.parser") 13 results = [url,soup.select("h4")] 14 print(url,soup.select("h4")) 15 16 df01=pd.DataFrame(results) 17 df01.to_csv('test_CL.csv')
s.k👍を押しています

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

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

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

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

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

stdio

2020/03/12 03:20

> ここにより詳細な情報を記載してください。 ここってどこですか? やって欲しいならそれは質問ではなく依頼になりますので、他のサイトを当たって下さい。
kentahi

2020/03/12 04:33

補足情報は消したのですがそのまま残ってただけです
guest

回答1

0

① 一つしか結果が保存されない

これは、ループの中の

python

1 df01.to_csv('test_CL.csv')

ここで、1つ分のデータしか入っていないDataFrameを同じ名前test_CL.csvのファイルに書いているので、ループのたびに上書きしているからです。

全てのデータを1つのCSVに書き出したいということであれば、

  1. 空のDFを用意する
  2. ループに入る

-> 回るたびにファイルの内容をDFに追加する
0. DFの内容をCSVに書き出す

というような処理にすればよいかと。

② 途中で失敗した場合、保存されない

途中で失敗とはどういう状況になるのでしょう?
例外を吐いて異常終了してしまうのであれば、その場所でtry-exceptで、例外を捕捉して、適切に処理して次に進むようにすればよいでしょう。

その他の問題であれば、それに応じた方法で回避すればよいでしょう。

投稿2020/03/12 04:01

TakaiY

総合スコア12801

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

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

kentahi

2020/03/12 07:40 編集

ありがとうございます やはりそうなってるんですね 2のDFのループに入れるのはどのように書けばいいのかを お手数をおかけしますがおしえていただけないでしょうか? 一応 cluster.append(results)で考えております また、途中で失敗に関しては OS ERRORと出てきております
stdio

2020/03/12 05:11

式w for文でresultsの数だけ回せば出来ます。 配列の要素数の取得の仕方は「len」と言う関数を利用しましょう。
kentahi

2020/03/12 07:17 編集

stdioさん 回答が不適切かつ人を不愉快にさせてます 「len」を使うわけない あなたの回答はいらないので一切投稿しないでください
TakaiY

2020/03/14 09:58

`cluster.append(results)`で可能ですが、それでお望みの結果が得られるかどうかはわかりません。場合によっては、一度pandas.Seriesを作ってからappendしたほうがいいかもしれません。 エラーについては、OSErrorということだけではどうアクションすべきなのかアドバイスできません。 起きそうなところといえば、URLを開くところとファイルに書き込むところですが、それぞれ状況に応じて適切に処理すればいいと思います。 ただ、エラーになる条件が判っていて回避できるのであれば、まずは、エラー処理の盛り込みは後回したほうがゴールに着きやすくなるでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問