我已经制作了这个抓取工具,我想知道为什么我的代码转到下一页不起作用。这是代码。
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();
}
}
请尽快安慰你。非常感谢你。
答案 0 :(得分:1)
一个可能的问题是,写SelectSingleNode("//blah")
将导致每次从根节点搜索文档,并且无论您从哪个节点开始搜索,它都将始终返回第一个匹配结果。这会导致您继续选择一个节点并重新抓取它。您应该使用.//
语法指定您从当前节点进行搜索:SelectSingleNode(".//blah")
。
所以你的XPATH应该是:
document.DocumentNode.SelectSingleNode(".//div[@id='mainContent']/div[@class='paginado']/div/*[contains(@class,'previous')]");
您还必须修复代码中的所有其他XPATH选择器,以便从当前节点而不是根节点中进行选择。