首页 > 解决方案 > 如何获取第一个谷歌搜索结果的 URL?

问题描述

我正在尝试获取第一个搜索结果的 URL。到目前为止,我已经尝试使用InputStream和将页面转换为 HTML AsyncTask。然后读取字符串,使用 java 正则表达式去除第一个 URL。

String str = result;
            String regex = "\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(str);
            if (matcher.find()) {
                System.out.println(matcher.group());
                Toast.makeText(getBaseContext(), matcher.group(), Toast.LENGTH_LONG).show();
            }

我的代码很好地从 HTML 文件中删除了第一个 URL,但是我注意到当我使用 android 设备保存 HTML 文件时,HTML 文件中没有 URL。必须有更好的方法来做到这一点。

标签: javaandroidwebview

解决方案


代替if(matcher.find()){} do while(matcher.find()){}

如果一行中有多个 URL,则您的正则表达式将仅解析该行中的第一个 URL,而忽略任何其他重要的 URL

IE:

while((line = reader.readLine()) != null) {
      Matcher matcher = pattern.matcher(line);
      while(matcher.find()){
            String url = matcher.group();
      }
}

您的代码已修改:

Pattern pattern = Pattern.compile("\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]");
Matcher matcher = pattern.matcher(result);
while (matcher.find()) {
    String url = matcher.group();
}

我猜您正在尝试获得第一个结果,并且您一定会看到很多随机的 google.com 网址,我建议使用Jsoup,因为强烈不建议尝试使用 REGEX 解析 XML/HTML ,它会变得一团糟,这将为您轻松解决所有问题。

IE:

Document connection = Jsoup.connect("https://www.google.com/search?q=query").get();
        
// all results are grouped into containers using the class "g" (group)
Elements groups = connection.getElementsByClass("g");
    
// check if any results were found
if(groups.size() <= 0) {
    System.out.println("no results found!");
    return;
}
    
// get the first result
Element firstGroup = groups.first();
        
// get the href from from first result
String href = firstGroup.getElementsByTag("a").first().attr("href");

推荐阅读