Python,将列表附加到文件并生成结果,scrapy

zed5wv10  于 2022-11-09  发布在  Python
关注(0)|答案(1)|浏览(140)

新的python,来自javascript。
我尝试使用for循环追加到plates列表,然后将结果生成到一个文件中--但我认为yield关键字在追加发生之前就已经触发了。我不完全确定这是否是问题所在。
我应该使用global吗?我应该使用asyncio吗?
不确定是否相关,但这是一个由scrapy crawl data_spider -o data_spider_results.json:'jsonlines'发起的零碎项目
谢谢你的帮助!

class DataSpider(scrapy.Spider):
    name = 'data_spider'
    allowed_domains = ['www.scraped-site.com']
    start_urls = ['http://www.scraped-site.com']

    def parse(self, response):
        table = response.xpath('//table[2]')
        plates = []

        for tr in table.xpath('.//tr'):
            b = tr.xpath('.//b//text()')
            name = b.get()

            ingredients = []
            p = tr.xpath('.//p//text()')
            ingredients.append(p.get())

            plate = {"name": name, "ingredients": ingredients}

            plates.append(plate)

        yield plates
2izufjch

2izufjch1#

当使用scrapy时,您只能从任何解析回调中生成scrapy.Itemdict ionary或request对象。
您使用append没有问题。
您可能最好生成每个单独的板,特别是因为您在scrapy命令中指明使用的是jsonlines格式。
例如:

class DataSpider(scrapy.Spider):
    name = 'data_spider'
    allowed_domains = ['www.scraped-site.com']
    start_urls = ['http://www.scraped-site.com']

    def parse(self, response):
        table = response.xpath('//table[2]')
        for tr in table.xpath('.//tr'):
            b = tr.xpath('.//b//text()')
            name = b.get()
            ingredients = []
            p = tr.xpath('.//p//text()')
            ingredients.append(p.get())
            plate = {"name": name, "ingredients": ingredients}
            yield plate

相关问题