Html Agility Pack,来自节点的SelectNodes

tha*_*sIT 17 .net c# html-agility-pack

为什么选择<li>我文档中的所有元素?

HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(url);

var travelList = new List<Page>();
var liOfTravels = doc.DocumentNode.SelectSingleNode("//div[@id='myTrips']")
                     .SelectNodes("//li");
Run Code Online (Sandbox Code Playgroud)

我想要的是用"myTrips" 获取所有<li>元素.<div>id

Chr*_*anV 16

这有点令人困惑,因为你期望它只在id为"myTrips"的div上做一个selectNodes,但是如果你做另一个SelectNodes("// li"),它将从文档的顶部执行另一次搜索.

我通过将语句合并为一个来修复此问题,但这只适用于只有一个ID为"mytrips"的div的网页.查询看起来像这样:

doc.DocumentNode.SelectNodes("// div [@ id ='myTrips'] // li");


gre*_*man 14

var liOfTravels = doc.DocumentNode.SelectSingleNode("//div[@id='myTrips']")
                 .SelectNodes(".//li");
Run Code Online (Sandbox Code Playgroud)

注意第二行中的点.基本上在这方面HTMLAgitilityPack完全依赖于XPath语法,但结果是不直观的,因为这些查询实际上是相同的:

doc.DocumentNode.SelectNodes("//li");
some_deeper_node.SelectNodes("//li");
Run Code Online (Sandbox Code Playgroud)


Rob*_*Rob 5

在某些情况下创建新节点可能是有益的,并允许您更直观地使用xpath.我发现这在几个地方很有用.

var myTripsDiv = doc.DocumentNode.SelectSingleNode("//div[@id='myTrips']");
var myTripsNode = HtmlNode.CreateNode(myTripsDiv.InnerHtml);
var liOfTravels = myTripsNode.SelectNodes("//li");
Run Code Online (Sandbox Code Playgroud)