如何解决如何使用 Jsoup 过滤掉某些链接
我正在创建一个简单的程序,它接受用户的搜索输入以及他们想要接收的链接数量。但是,我的代码有两个问题。
- 当我打印出链接时,它还包括图像、新闻等的链接...我想知道如何才能只保留与搜索相关的链接。
String searchURL = GOOGLE_SEARCH_URL + "?q="+searchTerm+"&num="+num;
Document doc = Jsoup.connect(searchURL).userAgent("Mozilla/5.0").get();
Elements results = doc.select("a[href]");
但是,使用 a[href]
过滤文档包括页面上的所有链接。我还尝试使用 h3.r > a
根本没有返回任何结果,还有 a > h3
,它解决了我当前的问题,但它只会显示标题而不是实际链接。这是我想删除的部分输出:
Title: Google
Link: https://www.google.com/?sa=X&ved=0ahUKEwifoOa-p7bvAhUDqlkKHS8fCsIQOwgC
Title: Google
Link: https://www.google.com/?num=5&output=search&sa=X&ved=0ahUKEwifoOa-p7bvAhUDqlkKHS8fCsIQPAgE
Title: News
Link: https://www.google.com/search?q=java&num=5&source=lnms&tbm=nws&sa=X&ved=0ahUKEwifoOa-p7bvAhUDqlkKHS8fCsIQ_AUICCgB
Title: Images
Link: https://www.google.com/search?q=java&num=5&source=lnms&tbm=isch&sa=X&ved=0ahUKEwifoOa-p7bvAhUDqlkKHS8fCsIQ_AUICSgC
Title: Books
Link: https://www.google.com/search?q=java&num=5&source=lnms&tbm=bks&sa=X&ved=0ahUKEwifoOa-p7bvAhUDqlkKHS8fCsIQ_AUICigD
Title: Maps
Link: https://maps.google.com/maps?q=java&num=5&um=1&ie=UTF-8&sa=X&ved=0ahUKEwifoOa-p7bvAhUDqlkKHS8fCsIQ_AUICygE
Title: Videos
Link: https://www.google.com/search?q=java&num=5&source=lnms&tbm=vid&sa=X&ved=0ahUKEwifoOa-p7bvAhUDqlkKHS8fCsIQ_AUIDCgF
...
- 因此,我最终得到的链接比请求的数量多得多,而且我认为它还包括页面的子链接(例如:当您搜索 Java 时,第一个链接是 java.com 及其子链接,这是下载页面)。
简而言之,我希望能够过滤掉 google 链接,例如图片、新闻、地图、购物等……并且只包含页面的主要链接。
解决方法
使用 python 无法实现您的目标,因为 Google 返回的 HTML 内容不包含搜索结果。一切都是从 JavaScript 构建的。您可以通过运行来检查它:
curl https://www.google.com/\?q\=stackoverflow\&num\=3 | grep stackoverflow
您将找不到任何 stackoverflow URL。您可以尝试自己运行 JavaScript,但使用 Google jsoup 会容易得多。
,我自己的解决方案:
Elements title = doc.select("a > h3");
Elements links = doc.select("a[href]");
Map<String,String> combo = new HashMap<>();
for (Element result : links) {
combo.put(result.text(),result.attr("abs:href"));
}
for (Element result : title) {
System.out.println("Title:"+result.text());
String temp = getSimilar(combo,result.text());
if(temp!=null)
System.out.println("Link:"+temp.substring(temp.indexOf("http",temp.indexOf("http") + 1),temp.indexOf("&")));
else
System.out.println("No link found");
System.out.println();
}
}
public static String getSimilar(Map<String,String> combo,String sim){
for (Map.Entry<String,String> key : combo.entrySet()){
if(key.getKey().contains(sim))
return key.getValue();
}
return null;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。