Python如何用fnmatch过滤黑名单站点 输出非黑名单href链接
问题原因
你的代码逻辑存在判断顺序错误:内层循环遍历黑名单规则时,只要站点不匹配当前遍历的某一条规则就会执行打印,导致站点哪怕匹配其他黑名单规则,也会因为不匹配某一条规则被重复输出,完全不符合过滤需求。
修正方案
核心逻辑调整为:先判断站点是否命中任意一条黑名单规则,只有完全没命中所有规则时,才属于非黑名单站点,执行打印。
修正后完整代码
import requests from bs4 import BeautifulSoup import fnmatch url = "http://stackoverflow.com" blacklist = ['*stackoverflow.com*', '*stackexchange.com*'] r = requests.get(url, timeout=6, verify=True) soup = BeautifulSoup(r.content, 'html.parser') for link in soup.select('a[href*="http"]'): site = str(link.get('href')) # 标记是否命中黑名单 is_black = False for filtering in blacklist: if fnmatch.fnmatch(site, filtering): is_black = True break # 命中后无需匹配剩余规则,提升效率 # 仅未命中黑名单时打印 if not is_black: print(site)
如果要简化代码,也可以用any()函数替代内层循环,写法更精简:
for link in soup.select('a[href*="http"]'): site = str(link.get('href')) if not any(fnmatch.fnmatch(site, rule) for rule in blacklist): print(site)
注:原代码中导入的
lxml、sys、re模块没有被使用,可以按需删除减少不必要的资源加载。
内容的提问来源于stack exchange,提问作者00xZ
相关产品推荐
相关产品推荐

