scrapy Python Web抓取问题与try yield有关,正在移除以前的数据

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

我在python中使用scrapy和try yield命令时遇到了一个问题。
如果我运行下面的脚本只在'名称'它返回的名称在该页上的完整列表预期,然而,当我在价格添加到脚本,然后为脱销项目没有价格,所以它返回'没有价格'预期,但也从输出中删除名称。我真的不明白为什么它这样做,我在下面添加了2个执行的屏幕截图(一个只运行名称,另一个运行名称和价格代码)

import scrapy
class TescoSpider(scrapy.Spider):
    name = 'tesco'
    start_urls = ['https://www.tesco.com/groceries/en-GB/shop/health-and-beauty/deodorants/all']
    def parse(self, response):
        for products in response.css('li.product-list--list-item'):
            try:
                yield {
                    'name': products.css('span.styled__Text-sc-1xbujuz-1.ldbwMG.beans-link__text::text').get(),
                    'price': products.css('p.styled__StyledHeading-sc-119w3hf-2.jWPEtj.styled__Text-sc-8qlq5b-1.lnaeiZ.beans-price__text::text').get().replace('£',''),
                }
            except:
                yield {
                    'name': 'no name',
                    'price': 'no price',
                }

下方
Output file to see issue

h6my8fg2

h6my8fg21#

这是因为当一个项目的价格不存在时,与您用来捕获价格的css选择器相匹配的元素也不存在:
products.css('p.styled__StyledHeading-sc-119w3hf-2.jWPEtj.styled__Text-sc-8qlq5b-1.lnaeiZ.beans-price__text::text')
这会导致选择器失败,并且当选择器失败时,它总是返回None
因此,当您调用products.css('p.styled__StyledHeading-sc-119w3hf-2.jWPEtj.styled__Text-sc-8qlq5b-1.lnaeiZ.beans-price__text::text').get()时,返回值为None
然后立即调用.replace('£',''),这样它会引发异常,因为None不是字符串,因此没有replace方法。
要在不使用try & except块的情况下解决此问题,您只需要在不同的步骤中评估价格。
例如:

import scrapy

class TescoSpider(scrapy.Spider):
    name = 'tesco'
    start_urls = ['https://www.tesco.com/groceries/en-GB/shop/health-and-beauty/deodorants/all']
    def parse(self, response):
        for products in response.css('li.product-list--list-item'):
            price = products.css('p.styled__StyledHeading-sc-119w3hf-2.jWPEtj.styled__Text-sc-8qlq5b-1.lnaeiZ.beans-price__text::text').get()
            yield {            
                'name': products.css('span.styled__Text-sc-1xbujuz-1.ldbwMG.beans-link__text::text').get(),
                'price': price.replace('£','') if price else None
            }

相关问题