You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:36:02