-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

一个可能的问题是,写入SelectSingleNode("//blah")将导致每次都从根节点搜索文档,并且无论您从哪个节点开始搜索,它总是会返回第一个匹配结果。这会导致您继续选择一个节点并重新抓取它。您应该使用.//语法来指定您正在从当前节点搜索:SelectSingleNode(".//blah").

所以你的 XPATH 应该是:

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

您还必须修复代码中的所有其他 XPATH 选择器,以便从当前节点而不是根节点进行选择。

于 2013-01-07T18:22:30.240 回答