【问题标题】:Recursively retrieving links from web page in Java在Java中递归地从网页中检索链接
【发布时间】:2012-09-17 14:30:06
【问题描述】:

我正在开发一个简化的网站下载器(编程作业),我必须递归地浏览给定 url 中的链接并将各个页面下载到我的本地目录。

我已经有一个函数可以从单个页面Set<String> retrieveLinksOnPage(URL url) 中检索所有超链接(href 属性)。此函数返回一个超链接向量。我被告知要下载第 4 级的页面。(第 0 级是主页)因此我基本上想检索网站中的所有链接,但我很难提出递归算法。最后,我打算这样调用我的函数:

retrieveAllLinksFromSite("http://www.example.com/ldsjf.html",0)

Set<String> Links=new Set<String>();
Set<String> retrieveAllLinksFromSite (URL url, int Level,Set<String> Links)
{
    if(Level==4)
       return;
    else{

        //retrieveLinksOnPage(url,0);
        //I'm pretty Lost Actually!
        }

}

谢谢!

【问题讨论】:

  • 不要使用矢量。使用SetHashSet,它将删除重复的链接
  • 递归的基本原则是参数之一与返回值相同。
  • 错字:“相同”到“相同类型”
  • @gigadot 你可以编辑你的评论。

标签: java http recursion


【解决方案1】:

这是伪代码:

Set<String> retrieveAllLinksFromSite(int Level, Set<String> Links) {
    if (Level < 5) {
        Set<String> local_links =  new HashSet<String>();
        for (String link : Links) {
            // do download link
            Set<String> new_links = ;// do parsing the downloaded html of link;
            local_links.addAll(retrieveAllLinksFromSite(Level+1, new_links));
        }
        return local_links;
    } else {
        return Links;
    }

}

您需要自己在 cmets 中实现事物。要从给定的单个链接运行函数,您需要创建一组初始链接,其中仅包含一个初始链接。但是,如果您有多个初始链接,它也可以工作。

Set<String> initial_link_set = new HashSet();
initial_link_set.add("http://abc.com/");
Set<String> final_link_set = retrieveAllLinksFromSite(1, initial_link_set);

【讨论】:

  • 如果有什么问题,请随时大喊。太晚了,我的头越来越晕了。
  • 现在去试试,谢谢,非常感谢! =)
【解决方案2】:

您可以使用HashMap 而不是Vector 来存储链接及其级别(因为您需要递归地将所有链接降至级别 4)

另外,它会是这样的(只是给出一个整体提示):

HashMap Links=new HashMap();

void retrieveAllLinksFromSite (URL url, int Level)
{
    if(Level==4)
       return;
    else{
        retrieve the links on current page and for each retrieved link,
        do {
           download the link
           Links.put(the retrieved url,Level)  // store the link with level in hashmap
           retrieveAllLinksFromSite (the retrieved url ,Level+1) //recursively call for

 further levels
            }

        }

}

【讨论】:

  • 这个伪代码没有用,因为它不符合逻辑。
  • 感谢指出,我写递归语句时出错了。你能再检查一下吗?
  • 还是不正确。一个网页可能包含多个链接。完成下载某个链接下的每个页面后,您希望转到同一级别的下一个链接。此逻辑不会出现在您的伪代码中。
猜你喜欢
  • 2014-10-31
  • 2019-04-25
  • 1970-01-01
  • 2010-11-08
  • 2019-09-29
  • 2010-09-26
相关资源
最近更新 更多