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

如何修复: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:17:45