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

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

ただいまの
回答率

90.52%

  • Python

    7938questions

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

  • Python 3.x

    6348questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 65

trey_0329

score 6

初歩的な質問で大変申し訳ございませんが、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を記載しています。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

import csv
import urllib

from bs4 import BeautifulSoup

url = 'https://dubai.dubizzle.com/motors/search/?page=1'  # 取得先URL
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html, 'html.parser')

data = []
for item_elems in soup.select('div.list-item-wrapper'):
    # 年代、走行距離
    li_elems = item_elems.select('ul.features > li')
    year = li_elems[0].text.replace('Year: ', '')  # 年代
    km = li_elems[1].text.replace('Kilometers: ', '')  # 走行距離
    # メーカー、種類
    breads = item_elems.select('p.breadcrumbs')[0].text
    breads = [s.replace('\u202a', '').strip() for s in breads.split('>‪')]  # \u202a は消す
    maker = breads[1]
    car_type = breads[2]
    # 値段
    price_elem = item_elems.select('div.price')[0]
    price = price_elem.text.replace(',', '').replace('AED', '').strip()  # , と AED は消す
    # リンク
    a_elem = item_elems.select('h3 a')[0]
    car_url = urllib.parse.urljoin(url, a_elem.get('href'))
    title = a_elem.text.strip()

    data.append({
        'year': year, 
        'km': km, 
        'maker': maker, 
        'type': car_type, 
        'price': price, 
        'title': title, 
        'url': car_url
    })


with open('output.csv', 'w') as f:
    # 列の出力順序を規定
    fields = ['title', 'url', 'maker', 'type', 'year', 'km', 'price']

    writer = csv.DictWriter(f, fieldnames=fields, quoting=csv.QUOTE_NONNUMERIC)
    writer.writeheader()  # ヘッダー出力
    writer.writerows(data)  # データ出力
"title","url","maker","type","year","km","price"
"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"
"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"
"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"
"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"
"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"
"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"
"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"
"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"
"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"
"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 21: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

    キャンセル

  • 2018/10/11 21:38

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

    キャンセル

  • 2018/10/11 21:41

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

    キャンセル

  • 2018/10/11 21:46

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

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7938questions

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

  • Python 3.x

    6348questions

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