Python 使多个if语句不那么冗长
我正在删除一个网页,它的html标记中没有使用任何有用的类或ID,所以我必须删除所有链接,并在链接中查找模式。下面是示例html的外观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'
分类
在另一页上,我们可能有一个不同的类别
类别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实现更有用。谢谢