我知道这可能是我在XPath中的noobness,但是让我确认一下,因为我已经足够google了。
我有一个网站,想从中获取新闻标题:www.farsnews.com(波斯语)
在firefox下手动使用FireBug和FireXpath扩展,我手工提取并测试与标题匹配的多个Xpath表达式,例如:
* html/body/div[2]/div[2]/div[2]/div[*]/div[2]/a/div[2]
* .//*[@class="topnewsinfotitle "]
* .//div[@class="topnewsinfotitle "]
我还使用XPather扩展程序对它们进行了测试,它们似乎工作得很好,但是当我测试它们时... SelectNodes返回null!
有任何线索或暗示吗?
这里有一大块代码:
listBox2.ResetText();
HtmlAgilityPack.HtmlWeb w = new HtmlAgilityPack.HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = w.Load("http://www.farsnews.com");
HtmlAgilityPack.HtmlNodeCollection nc = doc.DocumentNode.SelectNodes(".//div[@class=\"topnewsinfotitle \"]");
listBox2.Items.Add(nc.Count+" Items selected!");
foreach (HtmlAgilityPack.HtmlNode node in nc) {
listBox2.Items.Add(node.InnerText);
}
感谢。
答案 0 :(得分:4)
我测试了你的表情。正如Dialecticus在评论中提到的那样,你有一个不应该存在的结局空间。
//div[@class='topnewsinfotitle ']/text()
返回'空序列',请参阅评估:http://xmltools.dk/EQA-ACA6
//div[@class='topnewsinfotitle']/text()
返回标题列表,请参阅:http://xmltools.dk/EgA2APAj
但是,如果可以使用其他类(http://xmltools.dk/EwA8AJAW):
//div[contains(@class, 'topnewsinfotitle')]/text()
(我看到它们是我提供的链接中的编码问题,但是,它的含义和所有XPath表达式无关紧要,您可以删除/text()
来获取节点而不是只有文字)
但是,如果你拥有这个网站,你应该提供一个XML(可能是RSS或ATOM)或JSON的头条新闻,它们将具有更好的性能,最重要的是,更具防弹性。