gpt4 book ai didi

java - 从 jSoup 的元素列表中删除重复的 URL?

转载 作者:行者123 更新时间:2023-12-01 09:08:07 26 4
gpt4 key购买 nike

当使用jSoup抓取页面时,可以使用以下方式收集页面上的所有链接:

Elements allLinksOnPage = doc.select("a");

这太棒了。现在如何从该列表中删除重复的 URL? IE。想象一下在主导航中链接的/contact-us.html。

删除所有重复的 URL 后,下一步就是抓取这些唯一的 URL 并继续循环。

关于这个实用性的问题。对于代码;

for (Element e : allLinksOnPage) {
String absUrl = e.absUrl("href");

//Asbolute URL Starts with HTTP or HTTPS to make sure it isn't a mailto: link
if (absUrl.startsWith("http") || absUrl.startsWith("https")) {
//Check that the URL starts with the original domain name
if (absUrl.startsWith(getURL)) {
//Remove Duplicate URLs
//Not sure how to do this bit yet?
//Add New URLs found on Page to 'allLinksOnPage' to allow this
//For Loop to continue until the entire website has been scraped
}
}
}

所以问题是,循环的最后一部分,想象一下当抓取 page-2.html 时,更多的 URL 在这里被识别并添加到 allLinksOnPage 变量中。

for 循环是否会持续整个列表的长度,即在 page-1.html 上找到 10 个链接,在 page-2.html 上找到 10 个链接,因此总共将抓取 20 个页面 - 或 - 循环会吗仅继续识别的前 10 个链接的长度,即触发代码“for (Element e : allLinksOnPage)”之前的链接?

一旦逻辑最终确定,这一切都将不可避免地最终出现在数据库中,但希望最初保持逻辑纯粹基于 Java,以防止对数据库进行大量读/写,这会减慢一切。

最佳答案

allLinksOnPage 仅迭代一次。您永远不会检索有关您找到链接的页面的任何信息。

但是,您可以使用SetList 来实现此目的。此外,您可以使用 URL 类为您提取协议(protocol)。

URL startUrl = ...; 
Set<String> addedPages = new HashSet<>();
List<URL> urls = new ArrayList<>();
addedPages.add(startUrl.toExternalForm());
urls.add(startUrl);
while (!urls.isEmpty()) {
// retrieve url not yet crawled
URL url = urls.remove(urls.size()-1);

Document doc = JSoup.parse(url, TIMEOUT);
Elements allLinksOnPage = doc.select("a");
for (Element e : allLinksOnPage) {
// add hrefs
URL absUrl = new URL(e.absUrl("href"));

switch (absUrl.getProtocol()) {
case "https":
case "http":
if (absUrl.toExternalForm().startsWith(getURL) && addedPages.add(absUrl.toExternalForm())) {
// add url, if not already added
urls.add(absUrl);
}
}
}
}

关于java - 从 jSoup 的元素列表中删除重复的 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41086656/

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