0
public class Scanner {
    private HtmlProcessor hp;
    private String baseUrl;
    private int step = 0;

    public Scanner(String baseUrl) {
        this.hp = new HtmlProcessor();
        this.baseUrl = LinkParser.parseLink(baseUrl);
    }

    public void info(String url) throws IOException {


        String[] links =  hp.getLinksAndHrefs(url);
        System.out.println("Link : " + url + "\n"
                          +"ExtLinksCount : " + externalLinksCount(links) + "\n"
                          +"Steps to main : " + step
                          );
        String strippedLink;

        for (String link : links) {

            strippedLink = LinkParser.parseLink(link);

            if ( strippedLink.contains(this.baseUrl) && !strippedLink.equals(this.baseUrl) ) {
                ++ step; 
                info(link);
            }

            step = 0;
        }

    }

    public int externalLinksCount(String[] links) {
        int counter = 0;        

        String parsedLink;

        for (String link : links) {
             parsedLink = link;

            if ( ! ( parsedLink.contains( this.baseUrl ) ) ) {
                ++counter;
            }
        }


        return counter;

    }
}

我们有一些输入链接:“http://test.com” 这个链接有链接:“http://test.com”、“http://test.com/some”、“http://google. com”和“http://test.com/some”有链接:“http://facebook.com”、“some.com”

需要的结果是:主要步骤:0 链接:“http://test.com” ExtLinksCount:1

主要步骤:1 链接:“http://test.com/some” ExtLinksCount:2

我需要计算此页面上的所有外部链接,如果此页面有内部链接,请转到内部链接并计算此页面上的所有外部链接以及返回基本页面的步骤等。我知道如何从页面获取链接,但我不知道如何正确解决这个问题。在我的变体中,我用递归解决了这个问题。但是如果站点与基本链接相同,程序就会崩溃。

4

1 回答 1

2

递归似乎是要走的路。但是在递归中,您应该始终定义退出策略,否则您将进入无限循环。

仅检查 url 是否等于 baseurl 是不够的。如果两个子页面相互链接将导致无限循环。

所以我建议保留已解析链接的列表。在 ur info() 的第一个链接,检查列表是否包含 URL,如果是,则忽略并继续,否则添加到列表并处理..

修改后的代码

public class Scanner {
    private HtmlProcessor hp;
    private String baseUrl;
    private int step = 0;
    private List parsedLinks;

    public Scanner(String baseUrl) {
        this.hp = new HtmlProcessor();
        this.baseUrl = LinkParser.parseLink(baseUrl);
        this.parsedLinks = new ArrayList();
    }

    public void info(String url) throws IOException {
        if (!parsedLinks.contains(url)) {

            parsedLinks.add(url);

            String[] links = hp.getLinksAndHrefs(url);
            System.out.println("Link : " + url + "\n" + "ExtLinksCount : "
                    + externalLinksCount(links) + "\n" + "Steps to main : "
                    + step);
            String strippedLink;

            for (String link : links) {

                strippedLink = LinkParser.parseLink(link);

                if (strippedLink.contains(this.baseUrl)
                        && !strippedLink.equals(this.baseUrl)) {
                    ++step;
                    info(link);
                }

                step = 0;
            }
        }

    }

    public int externalLinksCount(String[] links) {
        int counter = 0;

        String parsedLink;

        for (String link : links) {
            parsedLink = link;

            if (!(parsedLink.contains(this.baseUrl))) {
                ++counter;
            }
        }

        return counter;

    }
}
于 2012-09-14T11:21:08.207 回答