Python 如何将此信息解析为单个项目?

Python 如何将此信息解析为单个项目?,python,python-3.x,web-scraping,scrapy,Python,Python 3.x,Web Scraping,Scrapy,我已经从一个网页上使用下面的刮擦蜘蛛刮以下信息。如何将此信息转换为单个项目,即一个项目应包括名称、大小、链接、扩展名、月份和年份 以下是爬行器的代码: import scrapy from scrapy.crawler import CrawlerProcess class MapSpider(scrapy.Spider): name = 'map' allowed_domains = ['map.gob.do'] def start_requests(self):

我已经从一个网页上使用下面的刮擦蜘蛛刮以下信息。如何将此信息转换为单个项目,即一个项目应包括名称、大小、链接、扩展名、月份和年份

以下是爬行器的代码:

import scrapy
from scrapy.crawler import CrawlerProcess


class MapSpider(scrapy.Spider):
    name = 'map'
    allowed_domains = ['map.gob.do']

    def start_requests(self):
        start_urls = [
            'https://map.gob.do/transparencia/recursos-humanos/nominas-de-empleados/']
        for url in start_urls:
            yield scrapy.Request(url=url, callback=self.parse,)

    def parse(self, response):
        panes = response.xpath('/html/body/div[8]/div/section/div/div/div[2]/div/div/div[3]/ul/li')
        tables = response.xpath('/html/body/div[8]/div/section/div/div/div[2]/div/div/div[3]/div/div')
        for pane in panes:
            Id = pane.css('::attr(href)').get(default='')
            Year = pane.css('::text').get(default='')
            yield{
                'year': Year,
                'id': Id
            }
        for d,table in enumerate(tables,1):
            yearId = table.css('.tab-pane ::attr(id)').get(default='')
            months = table.css('#'+ yearId + '.tab-pane .vr-tabs-nav-link ::text').getall()
            monthsIds = table.css('#'+ yearId + '.tab-pane .vr-tabs-nav-link ::attr(href)').getall()
            print(f'|||YEAR \' {d} \' INFO |||')
            yield{
                'yearId': yearId,
                'months': months,
                'monthsIds': monthsIds,
            }
            for c,monthId in enumerate(monthsIds,1):
                itemNames = table.css(monthId  + ' tr .wpfd_downloadlink ::attr(title)').getall()
                itemsLinks = table.css(monthId + ' tr.file .wpfd_downloadlink ::attr(href)').getall()
                itemsSizes = table.css(monthId + ' tr.file .file_size::text').getall()
                itemsExt = table.css(monthId + ' tr.file .wpfd_downloadlink > span > span ::attr(class)').getall()
                print(f'|||MONTH \' {c} \' INFO |||')
                yield {
                    'monthId': monthId,
                    'itemsNames': itemNames,
                    'itemsSizes': itemsSizes, 
                    'itemsLinks': itemsLinks,
                    'itemsExt': itemsExt
                }

process = CrawlerProcess()
process.crawl(MapSpider)
process.start()

当前,您的
table.css(…).getall()返回多个值,这些值都打包到
yield
中。收益率相对于回报率的优势在于,你也可以选择你的投资规模

将一般收益率替换为您想要的更具体的收益率。e、 g

for i in range(min(map(len, [itemNames, itemsLinks, itemsSizes, itemsExt]))):
    yield {
         'monthId': monthId,
         'itemsNames': itemNames[i],
         'itemsSizes': itemsSizes[i], 
         'itemsLinks': itemsLinks[i],
         'itemsExt': itemsExt[i]
          }

您可能需要另一个
for
-loop和
zip()
来对单个项目的值进行分组,或者您应该首先获取所有
tr
,然后使用
for
-loop分别处理每个
tr
。然后,您应该得到每行的值。它还可以有advantag—如果其中一行缺少数据,则您的版本无法捕获它,但它会将值从下一行移到缺少的值的位置—并且您会得到错误的结果。单独使用每个
tr
可以捕获行中缺少的元素并输入一些默认值。谢谢您的回答。我是用Lukas方法子索引的,因为选择器给了我我想要的信息,但是我接受了你的建议,用默认值替换缺少的值。现在我在将我的项目导入到spider时遇到问题。这给了我一个ModuleNotFoundError我应该在这里问这个问题还是应该打开另一个问题。最好在新页面上创建新问题,因为您必须显示完整的错误消息。或者最好先在谷歌上查一下这个错误——也许有人已经解决了这个问题——importat是它找不到的模块。可能您的文件放错文件夹了。Scrapy expect spiders和project中特殊文件夹中的模型。我在google中四处搜索,发现有类似错误的人,但发布的解决方案中没有一个对我有效。在我开始一个新问题之前,我会再尝试一下。谢谢你的回答,这非常有帮助。现在我在将我的项目导入到spider时遇到问题。这给了我一个ModuleNotFoundError。我应该为此提出一个新问题吗?