XPath Expression在HtmlAgilityPack中不起作用

时间:2010-08-28 06:45:57

标签: c# xpath html-agility-pack

我知道这可能是我在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);
        }

感谢。

1 个答案:

答案 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的头条新闻,它们将具有更好的性能,最重要的是,更具防弹性。