2010-08-28 69 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的頭條新聞,這將有更好的性能,最重要的是,更加防彈。