【问题标题】:Not all keys of dictionary are present in CSV并非字典的所有键都存在于 CSV 中
【发布时间】:2020-04-22 08:46:57
【问题描述】:

我正在尝试在 scrapy 中写入 csv。我有一本名为 features 的字典。我添加键,然后添加值。在这样的循环中添加了一些特定的键:

for i in paint_variable:
        print("inside")
        print(str(i[0]).replace(":",""))
        features[str(i[0]).replace(":","")] = ""
        features[str(i[0]).replace(":", "")]=(i[1])

pain_variables 是一个列表。它正在正确地添加密钥。

title Sahibinden Peugeot 407 2.0 HDi Executive Premium 2006 Model 
price  43.000 TL 
İlan No:  14215895   
İlan Tarihi:  15 Nisan 2020   
Marka:  Peugeot   
Seri:  407   
Model:  2.0 HDi Executive Premium   
Yıl:  2006   
Yakıt Tipi:  Dizel   
Vites Tipi:  Otomatik   
Motor Hacmi:  1997 cc   
Motor Gücü:  138 hp   
Kilometre:  295.000 km   
Boya-değişen:  Takasa Uygun   
Takasa Uygun:  Sahibinden   
Kimden: 
user_name [' Ayhan BOYSAN  ']
explanation ['-', '- Tuna Caddesi, Hayır Sokak, Lena Reklam. Hemen cadde üzerinde, köşede araç görülebilir. Arkadaşımın ofisinin önünde durmakta.', '* Muayenesi yok, biteli iki ay kadar oldu, satışta anlaşılırsa yaptırıp vereceğim.', '* Sol arka ABS sensörü arıza veriyor, 150 lira parça fiyatı var, parçacılar açılır açılmaz sipariş verip yaptıracağım.', '* 295000 bakımı yapılmadı. Satışta anlaşılırsa yaptırıp vereceğim.', '* Aküsü 2 yıllık, sorunu yok ama araç kullanılmadığı için bir iki gün ya şarj edilmeli ya da bir iki saat dolaşılmalı.\xa0', '* Düz yolda iyi ama yokuşta çekişi düşük.\xa0', '* Cam tavan perdesinin ikisi eksik. Biz perdesiz kullanıyorduk çünkü 3 numara Ziebart noktasında film yaptırmıştım, çok rahat.', '* Isıtmalı koltukların rolesi değişmesi gerek, koltuk ısıtmaları çalışmıyor, geçen kış arızalandı, aracı kullanmadığımız için\xa0 \xa0 \xa0 \xa0yaptırmaya ihtiyaç duymadık.', '* Ezik yok, çizikler var bazı yerlerde, tampon köşelerinde de resimlerde gözüken yıpranmalar var.\xa0', 'Aracın ARTILARI', '* Orjinal, değişeni yok, kazası yok, macun yok.', '* Kaskolu hala. Boyattığım için sadece 2500 lira trameri var. Tamamen kozmetik amaçlı boyattım, gören usta anlar.', '* Ön cam 1 numara, yanlar 2 numara, cam tavan 3 numara Ziebarth filmi mevcut.', '* Derileri ve döşemeleri çok iyi.', '* Kesinlikle ezik bir araç değil.\xa0', '* Cd Changer mevcut', '* Yedek anahtarı mevcut', '* 17" Jant ve Lastikleri iyi durumda.', '* Xenon - Far Yıkama - Cam Tavan vb.', '* Her yıl bakımını orjinal parça kullanarak yaptım.', 'Evde iki kişiyiz ve bunu babamın kullanımı için almıştım ama yaştan ötürü artık kullanamaz hale geldi, evdeki 3. araç. İlk kez satışa koyuyorum ve masrafları olduğu için bu rakamı yazıyorum. Piyasasının ne olduğunu hepimiz biliyoruz. Ucuz diye kazalı sanmayın.', 'Bedavacı kişiler ararsa eğer karşılıklı şekilde üzülürüz uyarıyorum :)', 'Göz boyamak, kandırmak niyetindeki insanlardan olmadığım için ne biliyorsam yazdım. Yıkamadan resimleri ekledim. Buna göre yakışıksız teklifler mesajlar atmayın.', 'Değerinde toprak ile takasa girerim dağın başında olmaması kaydı ile.', 'Aracı görmek isteyenler Bayrampaşa eski cezaevi tarafına USTASI ile gelebilir. Oraya buraya gitmez aracım. Olumlu olumsuz yazdıklarım geçerlidir.', 'MESAJLA SON RAKAM YAZANLARA CEVAP VERMEM. Pazarlık gönül kırmamak adına hak ettiği kadar yapılır.', 'Saat 20.00 den sonra telefonlara bakamayabilirim, mesaj atarsanız dönerim.', 'Teşekkürler']
Sağ Arka Çamurluk   Boyanmış 
Arka Kaput   Boyanmış 
Sol Arka Çamurluk   Boyanmış 
Sağ Arka Kapı   Boyanmış 
Sağ Ön Kapı   Boyanmış 
Tavan   Orijinal 
Sol Arka Kapı   Boyanmış 
Sol Ön Kapı   Boyanmış 
Sağ Ön Çamurluk   Boyanmış 
Motor Kaputu   Boyanmış 
Sol Ön Çamurluk   Boyanmış 
Ön Tampon   Boyanmış 
Arka Tampon   Boyanmış 
year 2006
feul_type Dizel
gear_type Otomatik
case_type Station wagon
kilometer 295.000 km
vehicle_type Bireysel Araç
color Bej
nationality (TR) Türkiye
warranty Garantisi Yok
first_owner İlk Sahibi Değilim
suitable_for_clearing Takasa Uygun
from_who Sahibinden
annual_mtv 1.124 TL
traction Motor ve Performans
number_of_cylinders Önden Çekiş
maxiumum_power 138 hp
minimum_power 11,2 sn
acceleration 201 km/s
maximumspeed Ortalama Yakıt Tüketimi

循环中的键在解释键之后开始。他们在这里。但它们不是用 csv 写入的。 enter image description here

如您所见,这些键不存在。 如果有人想重新创建,这是一个功能齐全的代码:

class Myspider(SitemapSpider):
    name = 'spidername'
    sitemap_urls = ['https://www.arabam.com/sitemap/otomobil_1.xml']
    sitemap_rules = [
        ('/otomobil/', 'parse'),
        # ('/category/', 'parse_category'),
    ]
    custom_settings = {'FEED_FORMAT':'csv','FEED_URI': str(datetime.today().strftime('%d%m%y'))+'.csv'}
    def parse(self,response):


            for td in response.xpath("/html/body/div[3]/div[6]/div[4]/div/div[2]/table/tbody/tr/td[4]/div/a/@href").extract():
                checks = str(td.split("/")[3]).split("-")

                for items in checks:
                    if items.isdigit():

                        if int(items) > 2001:

                            url = "https://www.arabam.com/"+ td
                            yield scrapy.Request(url, callback=self.parse_dir_contents)

    def parse_dir_contents(self,response):
        # print("hi here")
        features = {}
        features["ad_url"] = response.request.url
        features["ad_path"] =""
        for paths in response.xpath(" /html/body/div[3]/div[6]/div[1]/div/div/div/div[1]/div/span/a/text()").extract():
            features["ad_path"]+=paths
            features["ad_path"]+="/"
        features["title"] = response.xpath("/html/body/div[3]/div[6]/div[3]/div/div[1]/h1/text()").extract()[0]

        features["price"] = response.xpath("/html/body/div[3]/div[6]/div[3]/div/div[1]/div[1]/div[2]/div[1]/div/span/text()").extract()[0]

        for items in response.xpath("/html/body/div[3]/div[6]/div[3]/div/div[1]/div[1]/div[2]/ul/li/span[1]/text()").extract():
            features[(str(items) )] = ""
        counter = 1
        for items in response.xpath("/html/body/div[3]/div[6]/div[3]/div/div[1]/div[1]/div[2]/ul/li/span[2]/text()").extract():
            query = (response.xpath("/html/body/div[3]/div[6]/div[3]/div/div[1]/div[1]/div[2]/ul/li["+str(counter)+"]/span[1]/text()").extract())
            features[str(query[0])] = items
            counter+=1
        features["user_name"] = response.xpath("/html/body/div[3]/div[6]/div[3]/div/div[3]/div/div/div[1]/p/text()").extract()
        if not features["user_name"]:
            features["user_name"] = response.xpath("/html/body/div[3]/div[6]/div[3]/div/div[3]/div/div/div[1]/a/span/text()").extract()

        features["explanation"] = response.xpath("/html/body/div[3]/div[6]/div[3]/div/div[1]/div[3]/div/div[1]/div/div/p/text()").extract()
        #change this
        paint_variable = []
        for li in response.xpath("/html/body/div[3]/div[6]/div[3]/div/div[1]/div[3]/div/div[2]/div/div[2]/ul[1]/li"):

            paint_variable.append(li.xpath('span/text()').extract())

        for i in paint_variable:
            print("inside")
            print(str(i[0]).replace(":",""))
            features[str(i[0]).replace(":","")] = ""
            features[str(i[0]).replace(":", "")]=(i[1])


        options = webdriver.ChromeOptions()

        options.add_argument('headless')
        options.add_argument('window-size=1200x600')
        d = webdriver.Chrome(chrome_options=options,
                             executable_path='/Users/fatima.arshad/Downloads/chromedriver')
        d.get(features["ad_url"])
        # Use send_keys(Keys.HOME) to scroll up to the top of page
        d.find_element_by_tag_name('body').send_keys(
            Keys.END)
        while True:
            d.find_element_by_tag_name('body').send_keys(
                Keys.UP)
            e = d.find_element_by_xpath("/html/body/div[3]/div[6]/div[3]/div/div[1]/div[3]/div/div[3]/div")
            if e.text:
                break
        overview1 = e.text.split("\n")

        features["year"] = overview1[2]
        features["feul_type"] = overview1[4]
        features["gear_type"] = overview1[6]
        features["case_type"] = overview1[8]
        features["kilometer"] = overview1[10]
        features["vehicle_type"] = overview1[12]
        features["color"] = overview1[14]
        features["nationality"] = overview1[16]
        features["warranty"] = overview1[18]
        features["first_owner"] = overview1[20]
        features["suitable_for_clearing"] = overview1[22]
        features["from_who"] = overview1[24]
        features["annual_mtv"] = overview1[26]
        features["traction"] = overview1[29]
        features["number_of_cylinders"] = overview1[31]
        features["maxiumum_power"] = overview1[39]
        features["minimum_power"] = overview1[41]
        features["acceleration"] = overview1[43]
        features["maximumspeed"] = overview1[45]
        print("feature starting")
        for key, value in features.items():
            print(key, value)




        # print("s"+ str(overview1))
        yield features



process = CrawlerProcess({
})

process.crawl(Myspider)
process.start() # the script wi


  [1]: https://i.stack.imgur.com/qfS2e.png

【问题讨论】:

  • 尝试创建一个包含所有可能键的字典(最初)然后填充它们

标签: python csv dictionary scrapy


【解决方案1】:

您必须执行以下操作之一:

【讨论】:

    猜你喜欢
    • 2018-07-13
    • 1970-01-01
    • 2023-03-22
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多