如何忽略已访问过的域? Java | Jsoup

时间:2013-04-04 17:08:25

标签: java parsing jsoup

好的,所以我开始Bing搜索,然后检索一些结果网址并使用它们作为起点来遍历其他网页,解析它们的链接并将它们添加到List。

我遇到的问题是,我不想两次访问同一个域名。我可以阻止它访问相同的URL,但如果一个页面链接到网站的另一部分(例如关于页面)我不能。 目前我有一个LinkedList,我每次使用Jsoup从文档中解析一个URL时都会添加一个URL。我有一个HashMap用于存储已访问过的URL。所以我把它设置成一个基本的“if”,就像这样:

if(!urlsVisited.containsKey(url))
{
    urlsToVisit.add(url);
    urlsVisited.put(url, url); 
}

这是在for循环中,我检索每个页面上的链接(当前4个线程处理4页)。

这会阻止它添加两次“http://www.stackoverflow.com”之类的内容,但如果我遇到“http://www.stackoverflow.com/questions/ask”则无效。

我想从StackOverflow添加一个链接(例如),然后使用该域完成。有什么想法吗?

我在Java中使用Jsoup api来解析结果。

2 个答案:

答案 0 :(得分:2)

使用java.net.URL类提取主机名,并将其用作urlsVisited地图的关键字。

http://docs.oracle.com/javase/6/docs/api/java/net/URL.html#getHost()

答案 1 :(得分:2)

您可以使用URI类来解析您的网址。我还建议使用Set<String>来存储访问过的域名:

Set<String> urlsVisited = new HashSet<String>();
...

String domain = new URI(url).getHost();
if(!urlsVisited.contains(domain))
{
    urlsToVisit.add(url);
    urlsVisited.add(domain); 
}