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

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

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

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

Python

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

Q&A

解決済

1回答

304閲覧

スクレイピングしたデータをCSVファイルに保存したい(初歩的な質問ですみません)

trey_0329

総合スコア109

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2018/10/11 11:57

初歩的な質問で大変申し訳ございませんが、2時間調べても解決しなかったため、こちらにてお伺いさせて頂きます。

dataと出力すると
[{'km': '40,000','maker': 'Audi','price': '130000'}]
となるリストがあります。

それをデスクトップ上のCSVファイル(aaa)に保存しようとして
コードの最下部に
with open(r'C:\Users\Trey\Desktop\aaa.csv') as fp:
writer = csv.writer(f, lineterminator='\n')
writer.writerows(data)
と記載しましたが、その後ファイルを開いても白紙で何も保存されていません。
コードの最初にimport csvを記載しています。

考えられる原因は何かありますでしょうか?
ご教示お願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

先程の続きでしょうか。
各要素が辞書のリストを CSV に書き込むには DictWriter が便利です。
詳しくはリファレンスを参照してください。

python

1import csv 2import urllib 3 4from bs4 import BeautifulSoup 5 6url = 'https://dubai.dubizzle.com/motors/search/?page=1' # 取得先URL 7html = urllib.request.urlopen(url).read() 8soup = BeautifulSoup(html, 'html.parser') 9 10data = [] 11for item_elems in soup.select('div.list-item-wrapper'): 12 # 年代、走行距離 13 li_elems = item_elems.select('ul.features > li') 14 year = li_elems[0].text.replace('Year: ', '') # 年代 15 km = li_elems[1].text.replace('Kilometers: ', '') # 走行距離 16 # メーカー、種類 17 breads = item_elems.select('p.breadcrumbs')[0].text 18 breads = [s.replace('\u202a', '').strip() for s in breads.split('>‪')] # \u202a は消す 19 maker = breads[1] 20 car_type = breads[2] 21 # 値段 22 price_elem = item_elems.select('div.price')[0] 23 price = price_elem.text.replace(',', '').replace('AED', '').strip() # , と AED は消す 24 # リンク 25 a_elem = item_elems.select('h3 a')[0] 26 car_url = urllib.parse.urljoin(url, a_elem.get('href')) 27 title = a_elem.text.strip() 28 29 data.append({ 30 'year': year, 31 'km': km, 32 'maker': maker, 33 'type': car_type, 34 'price': price, 35 'title': title, 36 'url': car_url 37 }) 38 39 40with open('output.csv', 'w') as f: 41 # 列の出力順序を規定 42 fields = ['title', 'url', 'maker', 'type', 'year', 'km', 'price'] 43 44 writer = csv.DictWriter(f, fieldnames=fields, quoting=csv.QUOTE_NONNUMERIC) 45 writer.writeheader() # ヘッダー出力 46 writer.writerows(data) # データ出力

csv

1"title","url","maker","type","year","km","price" 2"Mercedes-Benz CL500 2003","https://dubai.dubizzle.com/motors/used-cars/mercedes-benz/c-class/2018/10/5/mercedes-benz-cl500-2003-2/?back=L21vdG9ycy9zZWFyY2gvP3BhZ2U9MQ%3D%3D&pos=1","Mercedes-Benz","C-Class","2003","200000","18000" 3"Nissan juke 2012 model 1.6L turbo AWD","https://dubai.dubizzle.com/motors/used-cars/nissan/juke/2018/10/5/ali-2/?back=L21vdG9ycy9zZWFyY2gvP3BhZ2U9MQ%3D%3D&pos=2","Nissan","Juke","2012","136000","27500" 4"AUDI S6 Quattro twin turbo","https://dubai.dubizzle.com/motors/used-cars/audi/rs6/2018/9/20/audi-s6-quattro-twin-turbo-2/?back=L21vdG9ycy9zZWFyY2gvP3BhZ2U9MQ%3D%3D&pos=3","Audi","S6/RS6","2014","64500","125000" 5"Bentley 51 series Flying Spur","https://dubai.dubizzle.com/motors/used-cars/bentley/continental/2018/10/7/bentley-51-series-flying-spur-2/?back=L21vdG9ycy9zZWFyY2gvP3BhZ2U9MQ%3D%3D&pos=4","Bentley","Continental","2012","49,000","230000" 6"G63 463 Edition AMG GCC specs UAE warranty VE...","https://dubai.dubizzle.com/motors/used-cars/mercedes-benz/g-class/2018/9/13/g63-amg-463-edition-gcc-specs-full-gargash-2/?back=L21vdG9ycy9zZWFyY2gvP3BhZ2U9MQ%3D%3D&pos=5","Mercedes-Benz","G-Class","2016","30000","369999" 7"fiat sport 500 model 2013 for sell","https://dubai.dubizzle.com/motors/used-cars/fiat/fiat-500/2018/10/8/fiat-sport-500-model-2013-for-sell-2/?back=L21vdG9ycy9zZWFyY2gvP3BhZ2U9MQ%3D%3D&pos=6","Fiat","Fiat-500","2013","65,000","24000" 8"2013 - Mitsubishi ASX -Price reduced!!!","https://dubai.dubizzle.com/motors/used-cars/mitsubishi/asx/2018/10/5/2013-mitsubishi-asx-2/?back=L21vdG9ycy9zZWFyY2gvP3BhZ2U9MQ%3D%3D&pos=7","Mitsubishi","ASX","2013","194000","35000" 9"Dodge Challenger 2014 GCC with lots of upgrad...","https://dubai.dubizzle.com/motors/used-cars/dodge/challenger/2018/10/8/dodge-challenger-2014-gcc-with-lots-of-upg-2/?back=L21vdG9ycy9zZWFyY2gvP3BhZ2U9MQ%3D%3D&pos=8","Dodge","Challenger","2014","90,000","49000" 10"Ford edge, lady driven, in excellent conditio...","https://dubai.dubizzle.com/motors/used-cars/ford/edge/2018/10/11/ford-edge-lady-driven-in-excellent-conditi-2/?back=L21vdG9ycy9zZWFyY2gvP3BhZ2U9MQ%3D%3D&pos=9","Ford","Edge","2008","240,000","15000" 11"NISAN SUNNY 2015 MODEL 1.5 cc gcc SPEC: 5010...","https://dubai.dubizzle.com/motors/used-cars/nissan/sunny/2018/10/7/nisan-sunny-2015-model-15-cc-gcc-spec-5010-2/?back=L21vdG9ycy9zZWFyY2gvP3BhZ2U9MQ%3D%3D&pos=10","Nissan","Sunny","2015","50,100","19500"

投稿2018/10/11 12:13

tiitoi

総合スコア21956

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

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

trey_0329

2018/10/11 12:32

度々のご回答誠にありがとうございます。 ご教示頂いたコードをJupyterで実行したところ、下記エラーが表示されてしまいます。 何度もすみませんがこちらについて何か良い解決策はございますでしょうか。 --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-11-08198765d25d> in <module>() 12 # 年代、走行距離 13 li_elems = item_elems.select('ul.features > li') ---> 14 year = li_elems[0].text.replace('Year: ', '') # 年代 15 km = li_elems[1].text.replace('Kilometers: ', '') # 走行距離 16 # メーカー、種類 IndexError: list index out of range
trey_0329

2018/10/11 12:38

先程無事に解決致しました。 何かのエラーだったようです。 ご丁寧にご指導頂き誠にありがとうございます。
tiitoi

2018/10/11 12:41

取得するたびに表示結果が変わるサイトのようなので場合によっては、指定したタグがないこともあるようです。 とりあえず、以下を入れてエラーにならなくなりましたが、他にも問題があるかもしれないので、エラーになった場合はエラーが発生した直前に print() 入れてなにが起こってるのか確認してみてください。 if len(li_elems) == 0: continue
trey_0329

2018/10/11 12:46

おっしゃる通り、ユーザーが頻繁に投稿するのでサイトがその都度書き換えられています。 お教え頂いたコードを実行したところエラーなしで動くようになりました。 大変勉強になりました。誠にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問