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)
在某些情况下创建新节点可能是有益的,并允许您更直观地使用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)