gpt4 book ai didi

java - 使用 Jsoup,我如何获取每个链接中的每个信息?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:34 26 4
gpt4 key购买 nike

     package com.muthu;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.helper.Validate;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.jsoup.select.NodeVisitor;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.jsoup.nodes.*;
public class TestingTool
{
public static void main(String[] args) throws IOException
{
Validate.isTrue(args.length == 0, "usage: supply url to fetch");
String url = "http://www.stackoverflow.com/";
print("Fetching %s...", url);
Document doc = Jsoup.connect(url).get();
Elements links = doc.select("a[href]");
System.out.println(doc.text());
Elements tags=doc.getElementsByTag("div");
String alls=doc.text();
System.out.println("\n");
for (Element link : links)
{
print(" %s ", link.attr("abs:href"), trim(link.text(), 35));
}
BufferedWriter bw = new BufferedWriter(new FileWriter(new File("C:/tool
/linknames.txt")));
for (Element link : links) {
bw.write("Link: "+ link.text().trim());
bw.write(System.getProperty("line.separator"));
}
bw.flush();
bw.close();
} }
private static void print(String msg, Object... args) {
System.out.println(String.format(msg, args));
}

private static String trim(String s, int width) {
if (s.length() > width)
return s.substring(0, width-1) + ".";
else
return s;
}
}

最佳答案

如果您连接到一个 URL,它只会解析当前页面。但您可以 1.) 连接到一个 URL,2.) 解析您需要的信息,3.) 选择所有进一步的链接,4.) 连接到它们,5.) 只要有新链接就继续此操作。

注意事项:

  • 您需要一个列表 (?) 或其他用于存储已解析链接的东西
  • 您必须决定是否只需要此页面的链接或外部链接
  • 您必须跳过“关于”、“联系方式”等页面。

编辑:
(注意:您必须添加一些更改/错误处理代码)

List<String> visitedUrls = new ArrayList<>(); // Store all links you've already visited


public void visitUrl(String url) throws IOException
{
url = url.toLowerCase(); // now its case insensitive

if( !visitedUrls.contains(url) ) // Do this only if not visted yet
{
Document doc = Jsoup.connect(url).get(); // Connect to Url and parse Document

/* ... Select your Data here ... */

Elements nextLinks = doc.select("a[href]"); // Select next links - add more restriction!

for( Element next : nextLinks ) // Iterate over all Links
{
visitUrl(next.absUrl("href")); // Recursive call for all next Links
}
}
}

您必须在选择下一个链接的部分添加更多限制/检查(也许您想跳过/忽略一些);以及一些错误处理。


编辑 2:

要跳过被忽略的链接,你可以使用这个:

  1. 创建一个 Set/List/其他的,你可以在其中存储被忽略的关键字
  2. 用这些关键字填充它
  3. 在使用要解析的新链接调用 visitUrl() 方法之前,检查此新 Url 是否包含任何被忽略的关键字。如果它至少包含一个,它将被跳过。

为此,我对示例做了一些修改(但它尚未测试!)。

List<String> visitedUrls = new ArrayList<>(); // Store all links you've already visited
Set<String> ignore = new HashSet<>(); // Store all keywords you want ignore

// ...


/*
* Add keywords to the ignorelist. Each link that contains one of this
* words will be skipped.
*
* Do this in eg. constructor, static block or a init method.
*/
ignore.add(".twitter.com");

// ...


public void visitUrl(String url) throws IOException
{
url = url.toLowerCase(); // Now its case insensitive

if( !visitedUrls.contains(url) ) // Do this only if not visted yet
{
Document doc = Jsoup.connect(url).get(); // Connect to Url and parse Document

/* ... Select your Data here ... */

Elements nextLinks = doc.select("a[href]"); // Select next links - add more restriction!

for( Element next : nextLinks ) // Iterate over all Links
{
boolean skip = false; // If false: parse the url, if true: skip it
final String href = next.absUrl("href"); // Select the 'href' attribute -> next link to parse

for( String s : ignore ) // Iterate over all ignored keywords - maybe there's a better solution for this
{
if( href.contains(s) ) // If the url contains ignored keywords it will be skipped
{
skip = true;
break;
}
}

if( !skip )
visitUrl(next.absUrl("href")); // Recursive call for all next Links
}
}
}

解析下一个链接是这样完成的:

final String href = next.absUrl("href");
/* ... */
visitUrl(next.absUrl("href"));

但是你可能应该在这部分添加更多的停止条件。

关于java - 使用 Jsoup,我如何获取每个链接中的每个信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13780291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com