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);
}
假设我有以下 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);
}