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

如何过滤URL字符串数组中含特殊字符及.pdf、.zip后缀的无效条目

问题根因

你的判断条件存在布尔逻辑错误:
当前的条件if(!(j.contains("#")) || !(j.contains("+")) || !(j.contains(".pdf")) || !(j.contains(".zip"))) 等价于if(!(j.contains("#") && j.contains("+") && j.contains(".pdf") && j.contains(".zip"))),只有当一个URL同时包含#、+、.pdf、.zip四个内容时才会被过滤,完全不符合「只要包含任意一项就剔除」的需求。你遇到的带#的URL依然进入爬取逻辑,就是因为这个逻辑漏洞导致的。

最优实现方案

1. 推荐写法(易读易维护)

直接先判断URL是否命中任意黑名单规则,命中就跳过当前循环,不需要嵌套多层非判断,可读性更高:

String url = "";
int x = 0;
while(x != TotalNumberOfUrls) {
    url = ValueOfGiantStringArray[x];
    x++;
    // 命中任意黑名单规则直接跳过
    if (url.contains("#") || url.contains("+") || url.contains(".pdf") || url.contains(".zip")) {
        continue;
    }
    // 执行爬取逻辑
}

2. 兼容原写法的修正

如果你要保留原有的if包裹爬取逻辑的写法,只需要把逻辑运算符从||(或)改成&&(与)即可:

if (!j.contains("#") && !j.contains("+") && !j.contains(".pdf") && !j.contains(".zip")) {
    // 执行爬取逻辑
}

可选优化

如果要避免误删URL中间带.pdf/.zip的正常页面(比如https://example.com/guide.pdf.html),可以把后缀判断改为严格匹配末尾:

  • 将url.contains(".pdf")改为url.endsWith(".pdf")
  • 将url.contains(".zip")改为url.endsWith(".zip")

如果后续黑名单规则会持续增加,可以把规则抽成独立的判断列表,避免判断条件过长:

// 预定义黑名单判断规则
List<Predicate<String>> blockRules = Arrays.asList(
    u -> u.contains("#"),
    u -> u.contains("+"),
    u -> u.endsWith(".pdf"),
    u -> u.endsWith(".zip")
);

// 调用处判断逻辑
boolean needBlock = blockRules.stream().anyMatch(rule -> rule.test(url));
if (needBlock) {
    continue;
}

内容的提问来源于stack exchange,提问作者GuyTryingToSolveAnIssue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:27:03