为什么爬虫不去下一页?

时间:2013-01-07 16:26:28

标签: c# xpath web-crawler

我已经制作了这个抓取工具,我想知道为什么我的代码转到下一页不起作用。这是代码。

        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();
    }
}

请尽快安慰你。非常感谢你。

1 个答案:

答案 0 :(得分:1)

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

所以你的XPATH应该是:

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

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