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と等しいかどうかだけをチェックするだけでは不十分です。2つのサブページが相互にリンクしている場合、無限ループが発生します。

したがって、解析されたリンクのリストを保持することをお勧めします。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 に答える