2010-08-28 70 views
3

我知道这可能是我在XPath中的新手,但是让我问一下,因为我已经使用了足够的搜索引擎。XPath表达式在HtmlAgilityPack中不起作用

我有一个网站,并想从它那里得到的消息标题:www.farsnews.com(这是波斯)

使用Firebug FireXpath扩展的Firefox下,用手我提取和测试多个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

HTML类名应该在最后包含空格吗? SelectNodes是否为每个案例返回null,即使是最微不足道的一个? – Dialecticus 2010-08-28 11:42:24

回答

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() 

(我明白他们是一个en编码问题,但是,它的意义和所有XPath表达式无关紧要,您可以删除/text()以获取节点而不是仅包含文本)

但是,如果您拥有这个网站,你应该提供一个XML(也许RSS或ATOM)或JSON的头条新闻,这将有更好的性能,最重要的是,更加防弹。