XPath表达式在HtmlAgilityPack中无法正常工作

3

我知道我的XPath技能可能有限,但是让我问一下以确保,因为我已经谷歌了很多。

我有一个网站,想从中获取新闻标题: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);
        }

感谢您的选择。

HTML类名应该以空格结尾吗?SelectNodes在每种情况下都返回null,即使是最微不足道的情况? - Dialecticus
1个回答

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格式的标题,这将具有更好的性能,并且最重要的是更加健壮。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接