Python 使多个if语句不那么冗长

Python 使多个if语句不那么冗长,python,filter,beautifulsoup,list-comprehension,Python,Filter,Beautifulsoup,List Comprehension,我正在删除一个网页,它的html标记中没有使用任何有用的类或ID,所以我必须删除所有链接,并在链接中查找模式。下面是示例html的外观 分类 在另一页上,我们可能有一个不同的类别 类别b 使用beautifulsoup4,我当前的解决方案如下所示 def category(soup): for x in soup.find_all('a'): if 'link-about-a' in x['href']: return 'A'

我正在删除一个网页,它的html标记中没有使用任何有用的类或ID,所以我必须删除所有链接,并在链接中查找模式。下面是示例html的外观

分类
在另一页上,我们可能有一个不同的类别

类别b
使用beautifulsoup4,我当前的解决方案如下所示

def category(soup):
    for x in soup.find_all('a'):
        if 'link-about-a' in x['href']:
            return 'A'
        if 'link-about-b' in x['href']:
            return 'B'
等等。。但这很难看

我想知道是否有一种方法可以让这篇文章不那么冗长

就像使用字典一样

categories = {'A': 'link-about-a', 'B': 'link-about-b'} 

并将其简化为单个表达式。

您只需要另一个循环:

for x in soup.find_all('a'):
    for k, v in categories.iteritems():
        if v in x['href']:
            return k
但是,如果需要单个表达式,请执行以下操作:

category = next((
    k for x in soup.find_all('a')
      for k, v in categories.iteritems()
      if v in x['href']
), None)

使用正则表达式和类别列表可能更灵活一些:

categories = [[re.compile('link-about-a'), 'A'], 
              [re.compile('link-about-b'), 'B']]

def category(soup):
    for x in soup.findAll('a'):
        for expression, description in categories:
            if expression.search(x['href']):
                return description
    else:
        return None

链接中的模式有多可预测?如果子字符串匹配是找到模式的唯一方法,Eric的解决方案是好的。我个人可能会使用元组的元组而不是dict来表示我只是作为键/值对进行迭代的内容,但这只是一个微不足道的区别。但是,如果您可以使用诸如regexp之类的东西可靠地提取模式,那么拥有一个将模式映射到类别的字典将是最好的方法。@peterdegloper该模式是可预测的,并且来自预定义的类别列表(a、B、C…),因此您是对的,我发现regex实现更有用。谢谢