2012-08-08 67 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