首先,我寻找类似的问题,但是找不到所需的答案。因此,请原谅我这个问题不是唯一的和新的。

我想获取google的前N个(可能是5个或10个)结果作为链接。
目前,我有这样的事情:

String url="http://www.google.com/search?q=";
String charset="UTF-8";
String key="java";
String query = String.format("%s",URLEncoder.encode(key, charset));
URLConnection con = new URL(url+ query).openConnection();
//next line is to trick Google who is blocking the default UserAgent
con.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
    System.out.println(inputLine);
in.close();


这为我提供了此搜索的完整Google html代码,但我只想获取前n个结果的原始链接。我该如何处理?

提前致谢。

最佳答案

您可能想尝试jsoup库,因为它花费了很多精力来解析网页:

Elements links = Jsoup.connect("https://www.google.com.au/search?q=fred")
    .get().select("h3.r").select("a");
for (Element link : links)
    System.out.println(link);


Elements扩展了ArrayList<Element>,因此您可以使用以下命令访问前n个元素:

for (int i = 0; i < n; i++)
    System.out.println(links.get(i));


或者,使用流:

links.stream().limit(n)...


如果只想要原始网址:

link.attr("href")


因此,将所有内容放在一起,以下内容将为Google搜索“ fred”一词打印前5个原始链接:

Jsoup.connect("https://www.google.com.au/search?q=fred").get()
    .select("h3.r").select("a")
    .stream()
    .limit(5)
    .map(l -> l.attr("href"))
    .forEach(System.out::println);

10-05 22:44
查看更多