HtmlAgilityPack 问题

HtmlAgilityPack issue

假设我有以下 HTML 代码:

<div class="MyDiv">
<h2>Josh</h2>
</div>


<div class="MyDiv">
<h2>Anna</h2>
</div>


<div class="MyDiv">
<h2>Peter</h2>
</div>

我想获取名称,所以这就是我所做的 (C#):

    string url = "https://...";
    var web = new HtmlWeb();
    HtmlNode[] nodes = null;
    HtmlDocument doc = null;
    doc = web.Load(url);
    nodes = doc.DocumentNode.SelectNodes("//div[@class='MyDiv").ToArray() ?? null;
    foreach (HtmlNode n in nodes){
         var name = n.SelectSingleNode("//h2");
         Console.WriteLine(name.InnerHtml);        
    }

输出:

Josh
Josh
Josh

这很奇怪,因为 n 只包含所需的 <div>。我该如何解决这个问题?

通过编写 .//h2 而不是 //h2

修复

这是因为您的 XPath 语句“//h2”。您应该将其简单地更改为“h2”。当您以两个“//”开头时,路径从顶部开始。然后它每次都选择“Josh”,因为那是第一个 h2 节点。

你也可以这样做:

List<string> names = 
    doc.DocumentNode.SelectNodes("//div[@class='MyDiv']/h2")
        .Select(dn => dn.InnerText)
        .ToList();
        
foreach (string name in names)
{
    Console.WriteLine(name);
}