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

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

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

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

Q&A

解決済

1回答

1393閲覧

list形式の変数の中身を1個ずつ改行しファイル出力するには?

Dantesu

総合スコア8

Python

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

0グッド

1クリップ

投稿2020/10/24 09:36

編集2020/10/25 01:32

#10/25 10:20更新
(スクレイピングした結果を)リスト形式の変数に格納したのですが、上手く出力できず苦戦しています。
「カンマ区切り」[python リスト ファイル出力」等のキーワードでGoogle上を調べても解決に至らず、ご教示頂けないでしょうか。

<スクレイピングした結果のデータのイメージ>
1列1行にカンマ区切りで複数の中身が入っています。分割したいです。
練習用に下記ページをスクレイピングしました。
https://www.mrso.jp/searches/?redirect&view=plan
イメージ説明

<トライしたこと>
(1)splitで分割する
split()でカンマで分割しようとすると、なぜかNANと出力されてしまいます。出来たとしても、価格を示す列(例 100,00,200,00)は、10000,20000ではなく、100,00,200,00になる不安があります。

(2-1)データフレームではなく、各リストをテキストに出力して、手で(ctrl+a,c,v)エクセルに貼り付ける
f.writelinesだと上述画像と同じ状況でした。エクセル上で分割して進める事もできますが、非効率ですしpythonを覚えたいのでこの選択肢は除外します。

(2-2)同上。for文で改行を入れる。
残念ながら下記のコードでも上述画像と同じ状況でした。
with open('(ファイル名).txt', 'w') as f:
for d in range(len(コース名:list形式)):
f.write(str(courses_list[d]) + "\n")

(スクレイピングの関数:本題ではないので省略) return courses_list,facili_list, price_list,link_list # コース、施設、価格、URLのリストを戻り値に指定 courses_list,facili_list,price_list,link_list=search(driver) with open('courses2.txt',mode='w', encoding='utf-8') as f: f.writelines((str(courses_list)))

<追記:元のスクレイピングのコード>

import time from selenium import webdriver driver=webdriver.Chrome() driver.get('https://www.mrso.jp/searches/?redirect&view=plan') def search(driver): i = 1 # ループ番号、ページ番号を定義 i_max = 5 # 最大何ページまで分析するかを定義 courses_list=[] facili_list=[] price_list=[] link_list=[] # 現在のページが指定した最大分析ページを超えるまでループする while i <= i_max: class_group =driver.find_element_by_class_name('page-search__list') courses_list.append([elem.text for elem in class_group.find_elements_by_class_name('-name')]) facili_list.append([elem.text for elem in class_group.find_elements_by_class_name('-facility-name')]) price_list.append([elem.text for elem in class_group.find_elements_by_class_name('-price')]) link_list.append([elem.get_attribute('href') for elem in class_group.find_elements_by_class_name('-link')]) try: next_list = driver.find_element_by_class_name('-next').click() i += 1 time.sleep(3) # 3秒間待機 except: break return courses_list,facili_list, price_list,link_list # コース名と施設名と価格とリンクのリストを戻り値に指定 courses_list,facili_list,price_list,link_list=search(driver) <抽出後のコード> import pandas as pd df=pd.DataFrame() df['施設名']=facili_list df['コース名']=courses_list df['価格']=price_list df['リンク']=link_list df.index = df.index + 1 df.head() #上述の画像の画面

<リストの中身の様子>
[['人間ドック(胃ABC)全身CTスキャン 低線量AIDR3D マルチスライスCTで実施', '人間ドック + 胃カメラコース (新規オープン価格)', ***膨大なため以下省略

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

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

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

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

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

toast-uz

2020/10/24 10:41

「(1)データフレームに集約して出力する」のコードの提示をお願いします。 その際のデータフレームの例を提示願います。膨大なため以下省略は、省略しすぎです。そもそも課題として考えられている「価格を示す列(例 100,00,200,00)」が登場する例にしましょう。 また、あわせて、どのようなデータフレームにしたいのか、という目指す姿も提示ください。
meg_

2020/10/24 11:02

> 「カンマ区切り」等のキーワードでGoogle上を調べても解決に至らず、 「python リスト ファイル出力」で検索すると良いと思います。
Dantesu

2020/10/24 14:36

toast-uz様 コメントありがとうございます。最初の質問文を編集し、スクレイピングした結果のデータがどんな形かスクリーンショットを貼り付けました。ご確認頂けますでしょうか?
Dantesu

2020/10/24 14:37

meg_様 ご助言ありがとうございます。検索して幾つかトライしましたが、残念ながら上手くできませんでした。 検索ページの先の方ももう少し調べます。
toast-uz

2020/10/24 14:49

「split()でカンマで分割しようとすると、なぜかNANと出力されてしまいます」のコードの提示をお願いします。元のデータフレームを加工するのが早いと思いますが、このNANが出た操作を参考までに確認したいです。なお、金閣は文字列として入っているようですので、金閣内のカンマと混同することは無いと思います。
toast-uz

2020/10/24 15:51

スクレイピングしたサンプルページを提示されていますので、スクレイピングのコードも提示をお願いします。どのようなデータフレームが得られたのかを正確に把握したいです。
meg_

2020/10/24 17:52

f.writelinesやf.write(str(courses_list[d]) + "\n")でファイル出力自体は出来ているのですよね? それらのファイルと質問者さんが欲しい結果との違いを明確にしてもらえると回答しやすくなるかと思います。 また、<リストの中身の様子>を見るとリストのリストのように見えますが合っていますか?
Dantesu

2020/10/25 01:33

toast-uz様<< スクレイピングのコードも追記しました。わざわざすみません
Dantesu

2020/10/25 01:40 編集

meg_様<< f.writelines(str(courses_list[d]) + "\n")では変わらず ループすると、下記のような1文字改行の出力結果になります。 *試行錯誤の結果、対応関係が曖昧になっており恐縮です [ [ ' 人 間 ド ッ ク ( 胃 A B C ) 全 身 C T ス キ ャ ン
meg_

2020/10/25 03:55

スクレイピングを試したところ、施設名は150個ありましたが、リンクが450個ありました。 現在のスクレイピングの仕方では施設に対してどのリンクが対応しているのが判別できないのではないでしょうか?
Dantesu

2020/10/25 04:43

meg_様<<< ご指摘ありがとうございます。見ていませんでした。そもそも、そこにも問題があったのですね。
guest

回答1

0

ベストアンサー

<抽出後のコード>を少し修正すれば、質問者様の欲しいデータフレームが作れます。

スクレイピングのコードの戻り値であるfacili_list等は、[[値, 値, 値, ・・・]]という形の2次元リストになってしまっています。よって、内側のリストを取り出すため[0]をつけてあげましょう。さらにlink_listは内側のリストに3倍の要素があります。中身を見ると、0番目、3番目、6番目、・・・と3の倍数の要素を取り出せると都合がよさそうです。よって、そのような操作を付け加えています。

以下、修正部分だけ記載しました。

Python

1df['施設名']=facili_list[0] 2df['コース名']=courses_list[0] 3df['価格']=price_list[0] 4df['リンク']=link_list[0][0::3] 5```

投稿2020/10/25 04:30

toast-uz

総合スコア3266

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

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

Dantesu

2020/10/25 04:42

toast-uz様<<< ありがとうございます!自分では到底分かりませんでした。抽出したデータの中身をきちんとみて考えるようにします。大変お手数をおかけしました。
Dantesu

2020/10/25 06:41

次以降のページ分は、df['施設名']=facili_list[0]+facili_list[1]のような形で足すようにしました。
toast-uz

2020/10/25 06:45

スクレイピングって、結構、「途中で思わぬエラーが出て止まる」ことがあるのと、間の時間をそれなりに空けてあげないとサイトに迷惑をかけます。一気に全ページとって処理、とするのはハードル高いです。ちょっととってファイルに書き出して、というのを繰り返すやりかたをオススメしすま。
Dantesu

2020/11/08 08:39

承知しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問