无法让XPATH使用Html Agility Pack

时间:2012-08-08 19:08:30

标签: c# .net xpath html-agility-pack

我正试图通过使用firebug获取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。我究竟做错了什么?

1 个答案:

答案 0 :(得分: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();