C# Can';无法使用Html敏捷包使用XPATH

C# Can';无法使用Html敏捷包使用XPATH,c#,.net,xpath,html-agility-pack,C#,.net,Xpath,Html Agility Pack,我试图通过使用firebug获取XPATH值,从而在Wikipedia上获得“今天的特色文章” 然后将其粘贴到我的代码中: string result = wc.DownloadString("http://en.wikipedia.org/wiki/Main_Page"); HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(

我试图通过使用firebug获取XPATH值,从而在Wikipedia上获得“今天的特色文章”

然后将其粘贴到我的代码中:

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。我做错了什么

因为Firebug显示的类似于Firefox的XPath生成了Html,这可能是也可能不是来自服务器的Html。此外,Firebug的路径是绝对的,每一个小小的改变都会打破它

更简单的方法是只查看Html,您要查找的p标记位于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的最好地方是

或者可以使用Linq,不过我觉得XPath更清晰一些

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

这为我指明了正确的方向,在这个特殊的情况下很有帮助,但是如果我试图刮取一个不总是每个元素都有id的网站呢?我会被迫使用xpath吗?好吧,您可以使用xpath和linq检查您想要获取的元素的每个其他属性。你能发布你想要解析的站点或部分结构吗?这会使帮助变得更容易:)Firebug可能会显示由脚本修改的html,但您正在加载原始服务器html。