如何使用Jsoup过滤掉某些链接



我正在创建一个简单的程序,该程序接受用户的搜索输入和他们想要接收的链接数量。但是,我的代码有两个问题。

  1. 当我打印出链接时,它还包括图像、新闻等的链接……我想知道如何只能保留与搜索相关的链接。

    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
...
  1. 正因为如此,我最终得到的链接比请求的数量多得多,我认为它还包括到页面的子链接(例如:当你搜索Java时,第一个链接是Java.com及其子链接,即下载页面(

简而言之,我希望能够过滤掉谷歌链接,如图片、新闻、地图、购物等……并且只包括页面的主要链接。

使用jsoup无法实现您的目标,因为谷歌返回的HTML内容不包含搜索结果。一切都是从JavaScript构建的。您可以通过运行进行检查

curl https://www.google.com/?q=stackoverflow&num=3 | grep stackoverflow

您将找不到任何stackerflow URL。你可以尝试自己运行JavaScript,但使用谷歌可编程搜索引擎会容易得多。

我自己的解决方案:

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;
}

最新更新