如何修复:TypeError: filter期望2个参数,实际传入1个(PyQt5/PySide6浏览器)
修复后的广告拦截浏览器页面代码
原代码核心问题在于广告拦截器初始化错误——filter()并非URL匹配工具,也没有match()方法,同时导航请求处理存在冗余逻辑。以下是修复后的完整代码:
import os from PyQt5.QtWebEngineWidgets import QWebEnginePage # 若使用PySide6,替换为PySide6.QtWebEngineWidgets.QWebEnginePage class WebPage(QWebEnginePage): # 初始化广告拦截规则列表 ad_rules = [] ad_list_path = os.path.join("build files", "adlist.txt") # 读取并加载广告规则 try: with open(ad_list_path, encoding="utf8") as f: for line in f: line = line.strip() # 跳过空行和注释行(adlist通常以#开头标注注释) if line and not line.startswith("#"): ad_rules.append(line) except FileNotFoundError: print(f"警告:未找到广告规则文件 {ad_list_path}") def __init__(self, parent=None): super().__init__(parent) def acceptNavigationRequest(self, url, _type, isMainFrame): url_str = url.toString() # 检查URL是否匹配广告规则 is_ad = any(rule in url_str for rule in WebPage.ad_rules) if is_ad: print(f"Blocking url --- {url_str}") return False # 阻止广告页面加载 else: print(f"TYPE {_type}") # 调用父类方法处理正常导航请求 return super().acceptNavigationRequest(url, _type, isMainFrame)
关键修复说明
- 规则加载逻辑:替换错误的
filter()初始化,改为正确读取规则文件,过滤无效行后存入规则列表。 - 匹配逻辑:用
any()检查URL是否包含规则列表中的关键词,实现基础广告拦截。 - 导航处理优化:移除冗余的
return语句,确保正常导航时调用父类方法,逻辑更清晰。 - 异常防护:增加文件未找到的捕获,避免程序崩溃并给出提示。
进阶优化建议
如果需要更精准的拦截(比如域名、正则匹配),可将规则改为正则表达式:
import re # 加载规则时编译正则 ad_rules = [re.compile(line.strip()) for line in f if line.strip() and not line.startswith("#")] # 匹配时使用正则搜索 is_ad = any(rule.search(url_str) for rule in WebPage.ad_rules)
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

