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

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

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

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

Q&A

解決済

1回答

2788閲覧

pythonでスクレイピングしたデータリストをエクセルに書き込みができない

kenshiroo

総合スコア7

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

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

0グッド

0クリップ

投稿2020/03/20 15:01

前提・実現したいこと

現在商品の価格を調べるためにpythonでスクレイピングをし、エクセルに記入書き込んでいくという作業をプログラミングしています。実現したいことは以下になります。
①エクセルでJANをpythonで読み込んでネット検索にて価格をスクレイピング。
②スクレイピングしたデータを読み込んだエクセルのJANコードと同じ行の最後(15列目)に記入。(現在この段階で躓いています。)
③価格が複数スクレイピングしてしまった場合、最安値のみ表示。

私はプログラミング歴は0~1年。趣味とスキルアップのため本やネット検索にて勉強しております。
今回いろいろ調べてみたのですがどうしても解決できなかったのでご教授をお願いいたします。
エクセル書き込み機能を実装中に以下のエラーメッセージが発生しました。

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

'list' object is not callable Cannot convert [599] to Excel ※599は取得した価格です

該当のソースコード

python

1# -*- coding: utf-8 -*- 2import requests 3from bs4 import BeautifulSoup 4from openpyxl import load_workbook 5import datetime 6import time 7import re 8 9#エクセルを開く&各種変数設定 10wbName='中間テスト用.xlsx'#補足事項をご覧ください。 11wb = openpyxl.load_workbook(wbName) 12ss1 = wb['売れ筋 先週'] 13wb.active = ss1 14 15#対象キーワードを読み込む 16kw=[]#検索対象のキーワードを格納するリスト 17for r1 in range(100): #ここは100としていますが何行になるか実際わからないです、、、 18 if ss1.cell(row=2+r1,column=4).value!=None: 19 kw.append(ss1.cell(row=2+r1,column=4).value) 20 21#スクレイピング本体 22 23print('スクレイピングを開始します') 24for i in range(len(kw)): 25 print('キーワード:「{}」の検索結果を取得します'.format(kw[i])) 26 url='https://kakaku.com/search_results/'+kw[i]+'/' # 27 html=requests.get(url) 28 #time.sleep(1) 29 soup =BeautifulSoup(html.text,'html.parser') 30 31 #item=[]#価格格納用リスト 32 for alldata in soup.find_all(class_="p-result_list_wrap"):#全体を取得 33 #item_a.append(alldata.find_all(class_="p-item_price").text) 34 item_a=[] 35 item_b=[] 36 for a in alldata.find_all(class_="p-item_price"):#価格ある場合のclassをすべて取得 37 datatext=a.text 38 datakakaku = int(re.sub("\D", "", datatext)) 39 item_a.append(datakakaku) 40 for b in alldata.find_all(class_='p-resultNone_line'):#価格がない場合のclass取得(商品がみつからなかったときこのclassがでる) 41 item_b.append(b.text)#リスト2に追記していく 42 43 print(item_a+item_b) 44 45 #------------------------------------------------ 46 #エクセルに書き込む 47 for r3 in range(len(kw)): 48 ss1.cell(row=r3+2, column=15).value = item_a + item_b 49 r3=r+1 50 wb.save(wbName) 51print('スクレイピングが完了しました')

試したこと

最後にエクセルで書き込むときforを使わないで最初のforの変数iを入力してみましたが
書き込めませんでした。これは見当違いかもしれませんがいろいろ試したなかの1つです。
ss1.cell(row=i+2, column=15).value = item_a(i) + item_b(i)
他に
for r3 in range(len(kw)):
ss1.cell(row=r3+2, column=15).value = item_a+item_b
r3=r+1
などです。

補足事項

イメージはこのような感じです。
エクセル(中間テスト)のセル
JAN             価格
A   B    C   D   ~~~        O
111111111           500
222222222           500
続く
またスクレイピングした価格を数字化し「min(item_a)」で抽出しようとしたができませんでした。
※これは今回の質問の内容とは違うのですが解決できていない問題の一つだったので記載させていただきました。item_aのリストないの最小の値を取得しようとしてもできませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

#エクセルに書き込む for r3 in range(len(kw)): ss1.cell(row=r3+2, column=15).value = item_a + item_b r3=r+1

のitem_a+item_bをstr(item_a+item_b)と文字列に変換すればできます。

リストはセルに書き込めないんでしょう。きっと。

投稿2020/03/20 15:49

Matsui_hero

総合スコア346

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

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

kenshiroo

2020/03/21 00:34

Matsui_hero様 解答ありがとうございます! for r3 in range(len(kw)): ss1.cell(row=r3+2, column=15).value = item_a + item_b r3=r+1 上記から以下に書き換えました! for r3 in range(len(kw)): ss1.cell(row=r3+2, column=15).value = str(item_a+item_b) r3=r3+1 そしたらエラーコードして [Errno 13] Permission denied: '中間テスト用.xlsx' がでたのでもう少しいろいろ調べてみます! ※エラーが出たので解決できたのかどうかが判断できなくて、、、 上書き保存保存をしたいので'中間テスト用.xlsx'を確認したら読み込み専用にはなっていなかったので 他の原因があるのでしょうか、、、
Matsui_hero

2020/03/21 01:25

'中間テスト用.xlsx'ファイルを開いたまま実行してませんか?
kenshiroo

2020/03/21 08:47

閉じてたまま実行しました。 for r3 in range(100): ss1.cell(row=r3+2, column=15).value = str(item_a+item_b) r3=r3+1 for r3 in range(100):←ここを変えるとエラーがでなかったのですが書き込み内容はJANとあった価格ではありませんでした。ただエクセルには書き込めるようになったのでこれだけでも一歩前進です!! ありがとうございます! ここを100にすると取得した最後の価格がずっと100行続きました、、、 もっと勉強してみます。
Matsui_hero

2020/03/21 10:46

書き込みできるようになって何よりです!! >ここを100にすると取得した最後の価格がずっと100行続きました、、、 >もっと勉強してみます。 現在のソースコードでは、for文でitem_a+item_bを取得して、そのあとfor文でstr(item_a+item_b)を書き込んでいます。その動きを見てみると修正点が分かると思いますので、デバッグ頑張ってください。
kenshiroo

2020/03/21 10:50

Matsui_hero様 ありがとうございます! できるだけ自分の力で解決したいのですがどうしてもわからなかったらまた質問するかもしれないです、、、 初めてのteratailでの質問だったので聞くのも緊張しましたがとても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問