我正在尝试从维基百科网站上的表中搜索数据,到目前为止,我已经设法找到了我需要引用的节点。维基百科上的表格中有大量条目,但是,当我运行应用程序时,我只得到12个结果并且它们都是相同的。返回的所有结果都是表格中第一个条目的重复。
关于如何修复的任何想法?
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
string htmlPage = "";
{
htmlPage = await client.GetStringAsync("http://en.wikipedia.org/wiki/List_of_Games_with_Gold_games");
}
HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(htmlPage);
foreach (var div in htmlDocument.DocumentNode.SelectNodes(".//h2"))
{
GameHistory newGameHistory = new GameHistory();
newGameHistory.historyTitle = div.SelectSingleNode("//i//a").InnerText.Trim();
newGameHistory.historyAdded = div.SelectSingleNode("//span[starts-with(@style, 'white')]").InnerText.Trim();
newGameHistory.historyRemoved = div.SelectSingleNode("(//span[starts-with(@style, 'white')])[2]").InnerText.Trim();
gameHistory.Add(newGameHistory);
}
lstGameHistory.ItemsSource = gameHistory;
}
答案 0 :(得分:0)
你的XPath不完全正确......
foreach (var div in htmlDocument.DocumentNode.SelectNodes(".//h2"))
{
GameHistory newGameHistory = new GameHistory();
newGameHistory.historyTitle = div.SelectSingleNode("//i//a").InnerText.Trim();
newGameHistory.historyAdded = div.SelectSingleNode("//span[starts-with(@style, 'white')]").InnerText.Trim();
newGameHistory.historyRemoved = div.SelectSingleNode("(//span[starts-with(@style, 'white')])[2]").InnerText.Trim();
gameHistory.Add(newGameHistory);
}
说“我有一个 h2 标签。让我在其中包含 a 标签的所有 i 标签,并确定 span 标签......与 h2 标签无关。让我们继续在整个文档中获得第一。“ (这就是双斜杠的意思)。
你得到12个结果,因为那是 h2 标签的数量。
在任何情况下,即使您专门使用 h2 标记作为参考,它似乎与行有很大关系,看着它!
所以你需要的是获得一个XPath,它将获得正确表的每一行(在本例中为表)。然后,对于每一行,您的XPath应以“。”开头。 (自我),这样你就不会再回到文档的根目录了。
此外,有几款游戏没有“已移除”列,因此您也应该处理它。
Voila我的代码:
foreach (var div in htmlDocument.DocumentNode.SelectNodes("//table[@class='wikitable sortable']/tr[td/i/a]"))
{
GameHistory newGameHistory = new GameHistory();
newGameHistory.historyTitle = div.SelectSingleNode(".//i//a").InnerText.Trim();
newGameHistory.historyAdded = div.SelectSingleNode(".//span[starts-with(@style, 'white')]").InnerText.Trim();
newGameHistory.historyRemoved = div.SelectSingleNode("(.//span[starts-with(@style, 'white')])[2]") != null? div.SelectSingleNode("(.//span[starts-with(@style, 'white')])[2]").InnerText.Trim() : string.Empty;
gameHistory.Add(newGameHistory);
}
提示:要获得标题,在foreach循环内部(从 tr 开始),你上去一次(..)转到 table 标签,然后,要获取h2,它是 table 之前的标记,请使用previous-sibling。
所以XPath将是"../preceding-sibling::h2"
。似乎h2会捕获一些其他角色,所以你必须进一步优化你的XPath。