首页 > 解决方案 > 具有相似模式的多个 if 语句

问题描述

我有以下有效的代码,但我正在寻找一种以更pythonic的方式编写它的方法

    if item['merchant_1']=='Google' and not item['merchant_1_price']:
        yield scrapy.Request(url=item['merchant_1_link'],callback=self.parse_google,meta={'item': item})
    elif item['merchant_2']=='Google' and not item['merchant_2_price']:
        yield scrapy.Request(url=item['merchant_2_link'],callback=self.parse_google,meta={'item': item})

    elif item['merchant_1']=='Amazon' and not item['merchant_1_price']:
        yield scrapy.Request(url=item['merchant_1_link'],callback=self.parse_amazon,meta={'item': item})        
    elif item['merchant_2']=='Amazon' and not item['merchant_2_price']:
        yield scrapy.Request(url=item['merchant_2_link'],callback=self.parse_amazon,meta={'item': item})

    elif item['merchant_1']=='Ebay' and not item['merchant_1_price']:
        yield scrapy.Request(url=item['merchant_1_link'],callback=self.parse_ebay,meta={'item': item})
    elif item['merchant_2']=='Ebay' and not item['merchant_2_price']:
        yield scrapy.Request(url=item['merchant_2_link'],callback=self.parse_ebay,meta={'item': item})
    # another 30 similar elif statements for different sites

def parse_google(self,response):
    #code
def parse_amazon(self,response):
    #code
def parse_ebay(self,response):
    #code

我有两个商家(可能有价格,也可能没有价格),他们肯定会有一个链接,如果他们中的任何一个没有价格,它应该产生他们各自的parse_seller(亚马逊、谷歌、ebay、...)。我以类似的模式编写了所有解析方法,以便编写更好看的(Pythonic)代码。我正在寻找一种更紧凑的方式来编写这些 if 语句

标签: pythonscrapy

解决方案


一种方法是使用一个简单的列表。

companies = ["Google", "Amazon", "Ebay"]
for company in companies:
    for i in range(1, 3):
        if item[f"merchant_{i}"] == company and not item[f"merchant_{i}_price"]:
            yield scrapy.Request(url=item[f"merchant_{i}_link"],callback=getattr(self, f"parse_{company.lower()}"),meta={'item': item})

推荐阅读