Python Scrapy CSV文件的格式不正确

Python Scrapy CSV文件的格式不正确,python,csv,scrapy,Python,Csv,Scrapy,基本上,我把我提取的数据放在一个csv文件中,但格式有一些问题 -首先,仅显示零件,不显示其他任何零件。数量和价格 -其次,列标题似乎在向下重复行 我想为零件,价格,数量显示在不同的列和标题将是名称。如果有人能告诉我在哪里可以学着做这件事,那将非常有帮助 name = 'digi' allowed_domains = ['digikey.com'] custom_settings = { "USER_AGENT": "Mozi

基本上,我把我提取的数据放在一个csv文件中,但格式有一些问题

-首先,仅显示零件,不显示其他任何零件。数量和价格 -其次,列标题似乎在向下重复行

我想为零件,价格,数量显示在不同的列和标题将是名称。如果有人能告诉我在哪里可以学着做这件事,那将非常有帮助

    name = 'digi'
    allowed_domains = ['digikey.com']
    custom_settings = {
        "USER_AGENT": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"


    }
    start_urls = ['https://www.digikey.com/products/en/integrated-circuits-ics/memory/774?FV=-1%7C428%2C-8%7C774%2C7%7C1&quantity=0&ColumnSort=0&page=1&k=cy621&pageSize=500&pkeyword=cy621']

    def parse(self, response):
        data={}
        parts=response.css('Table#productTable.productTable')
        for part in parts:
            for p in part.css('tbody#lnkPart'):
                yield {
                    'Part': p.css('td.tr-mfgPartNumber span::text').extract(),
                    'Quantity': p.css('td.tr-minQty.ptable-param span.desktop::text').extract(),
                    'Price': p.css('td.tr-unitPrice.ptable-param span::text').extract()
                }
背景

BOT_NAME = 'website1'

SPIDER_MODULES = ['website1.spiders']
NEWSPIDER_MODULE = 'website1.spiders'

#Export as CSV Feed
#FEED_EXPORT_FIELDS: ["parts", "quantity", "price"]
FEED_FORMAT = "csv"
FEED_URI = "parts.csv"

# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'website1 (+http://www.yourdomain.com)'

# Obey robots.txt rules
ROBOTSTXT_OBEY = True

在Scrapy shell中进行测试时,您是否获得了正确的数据?在将选择器提交到脚本之前,在ScrapyShell中试用它们是值得的

我没有详细研究CSS选择器,但是有很多for循环,基本上你需要做的就是在tr上循环。因此,找到一个CSS选择器来获取所有的行,而不是在整个表上循环并向下搜索,可能更有效

更新:

因为你问过for循环

for p in response.css('tbody#lnkPart > tr'):
        
       yield {
                'Part': p.css('td.tr-mfgPartNumber span::text').get(),
                'Quantity': p.css('td.tr-minQty.ptable-param span.desktop::text').get(),
                'Price': p.css('td.tr-unitPrice.ptable-param span::text').get()
       }
注意,我们只需要围绕tr循环,这将选择所有tr。get()方法仅选择具有特定tr的项

注意,您需要考虑如何处理空间和无项。值得仔细考虑这一部分,并提出一种修改结果的简单方法

更新代码

def parse(self, response):

    for p in response.css('tbody#lnkPart > tr'):
    
        if p.css('td.tr-minQty.ptable-param span.desktop::text').get(): 
            quantity = p.css('td.tr-minQty.ptable-param span.desktop::text').get()
            quantity = quantity.strip()
            cleaned_quantity = int(quantity.replace(',',''))
        else:
            quantity = 'No quantity'
     
        if p.css('td.tr-unitPrice.ptable-param span::text').get():
            price = p.css('td.tr-unitPrice.ptable-param span::text').get()
            cleaned_price = price.strip()
        else: 
            price = 'No Price'
        yield {
                'Part': p.css('td.tr-mfgPartNumber span::text').get(),
                'Quantity': cleaned_quantity,
                'Price': cleaned_price
                }

我在这个废弃的外壳中得到了正确的数据。所以我不需要tbody#InkPart循环,我可以直接去tr?我在寻找一个CSS选择器时感到困惑,该选择器在响应中为p获取行。CSS('tbody#lnkPart>tr'):yield{'Part':p.CSS('td.tr-mfgPartNumber span::text')。get(),'Quantity':p.CSS('td.tr-minQty.ptable-param span.desktop::text')。get(),'Price':p.CSS('td.tr-unitPrice.ptable-param span::text').get()}就是我的意思。您只需要选择tr的.get()只抓取与特定tr相关的项目。注意,一旦你有了这些项目,你需要考虑如何去除空间。值得考虑的是,你可以如何处理这个问题。因此,我需要使用CSS选择器来更改行并找出空项目,还是应该使用csvExporter?如果你有一个链接可以帮助我,我对python非常陌生因为现在我正在看这个。它选择一个CSS选择器,它将为您获取所需的数据。每一行都有关于该部分的价格、数量、价格等数据。'tbody#lnkPart'选择id为lnkPart.CSS的tbody('tbody'lnkPart>tr')给你一个id=lnkPart的tbody内每一行的列表。可能会对你有所帮助。这样我们就可以循环每一行。我们可以像你已经写出“部分”一样获取行中的数据:p.css…等等。看看代码,我已经先更新了我的答案。我似乎已经让它工作了谢谢,现在我有一个问题,这只是其中的6项,但谢谢!