2012-08-08 122 views
1

我試圖通過使用螢火蟲獲取XPATH值來獲得維基百科上的「今日特色文章」。無法使用Html Agility Pack獲得XPATH

enter image description here

然後將其粘貼到我的代碼:

string result = wc.DownloadString("http://en.wikipedia.org/wiki/Main_Page"); 

      HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 

      doc.LoadHtml(result); 

      var featuredArticle = doc.DocumentNode.SelectSingleNode("/html/body/div[3]/div[3]/div[4]/table[2]/tbody/tr/td/table/tbody/tr[2]/td/div/p"); 

然而,featuredArticle始終返回null。我究竟做錯了什麼?

+0

Firebug可能會顯示由腳本修改的html,但您正在加載原始服務器html。 – Vlad 2017-04-06 23:42:50

回答

2

因爲Firebug顯示了像Firefox這樣的XPath製作了Html,可能或不可能是服務器上的Html。另外,Firebug的路徑是絕對的,每一個小變化都可以打破它。

而更簡單的方法是隻看Html,你正在尋找的p-Tag是一個id爲mp-tfa的div,所以將XPath看成div更容易,只是得到第一個p內。

像這樣:

var wc = new WebClient(); 
var doc = new HtmlDocument(); 
doc.Load(wc.OpenRead("http://en.wikipedia.org/wiki/Main_Page")); 
var featuredArticle = doc.DocumentNode.SelectSingleNode("//div[@id='mp-tfa']/p"); 
Console.WriteLine(featuredArticle.InnerText); 

最好的地方,學習如何使用XPath是w3schools.com

或者你可以使用Linq,但我覺得XPath更清晰一點。

var featuredArticle= doc.DocumentNode.Descendants("div") 
.First(n => n.Id == "mp-tfa") 
.Descendants("p").FirstOrDefault(); 
+0

這使我指向正確的方向,並在這種特殊情況下有所幫助,但如果我試圖刮掉一個並不總是擁有每個元素的id的網站呢?難道我不會被迫使用xpath嗎? – broke 2012-08-09 15:31:55

+0

好吧,你可以使用xpath和linq來檢查你想獲得的元素的其他所有屬性。你能發佈網站或你想分析的結構的一部分嗎?這會讓它更容易幫助:) – shriek 2012-08-09 16:18:50