-1

このクローラーを作成しましたが、次のページに移動するコードが機能しない理由を知りたいです。ここにコードがあります。

        var pessoaFinder = new ABCTelefonosPessoasLinkFinder();
        var pessoaContent = new ABCTelefonosPessoasContentFinder();
        var Urls = DadoPo.ListarUrls();


        foreach (var url in Urls)
        {
            var tempPessoas = new List<string>();
            tempPessoas.AddRange(pessoaFinder.Find(url));

            foreach (var linkPessoa in tempPessoas)
            {
                var infoPessoa = new List<DadoTo>();
                infoPessoa.AddRange(pessoaContent.Find(url + linkPessoa));


                foreach (var pessoa in infoPessoa)
                {
                    if (DadoPo.VerificaLink(url + linkPessoa))
                    {
                        continue;
                    }
                   DadoPo.Salvar(pessoa);
                }
            }
        }
    }

これにより、リンクを検索する関数を呼び出す関数が呼び出され、次のページに移動します。個人情報を検索して次のページに移動する関数がここにあります(エラーがあると思われる場所)。

    public string[] Find(string url)
    {
        var webGet = new HtmlWeb();
        var document = webGet.Load(url);
        var nodes = document.DocumentNode.SelectNodes("//div[@id='mainContent']/div/a");

        if (nodes == null)
        {
            return new string[0];
        }

        foreach (var node in nodes)
        {
            var href = node.GetAttributeValue("href", "");
            cidades.Add(href);
        }

        var elUrlProximaPagina = document.DocumentNode.SelectSingleNode("//div[@id='mainContent']/div[@class='paginado']/div/*[contains(@class,'previous')]");

        if (elUrlProximaPagina == null)
        {
            return cidades.ToArray();
        }

        var urlProximaPagina = elUrlProximaPagina.GetAttributeValue("href", "");

        if (!String.IsNullOrEmpty(urlProximaPagina))
        {
            return Find(urlProximaPagina);
        }
        return cidades.ToArray();
    }
}

できるだけ早く答えてください。どうもありがとうございました。

4

1 に答える 1

1

考えられる問題の 1 つは、書き込みSelectSingleNode("//blah")によって毎回ルート ノードからドキュメントを検索することになり、検索を開始するノードに関係なく、最初に一致した結果が常に返されることです。これにより、1 つのノードを選択して再クロールし続ける必要があります。.//現在のノードから検索していることを指定するには、次の構文を使用する必要がありますSelectSingleNode(".//blah")

したがって、XPATH は次のようになります。

document.DocumentNode.SelectSingleNode(".//div[@id='mainContent']/div[@class='paginado']/div/*[contains(@class,'previous')]");

ルート ノードからではなく、現在のノードから選択するように、コード内の他のすべての XPATH セレクターも修正する必要があります。

于 2013-01-07T18:22:30.240 に答える