如何过滤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
相关产品推荐
相关产品推荐

