使用Html Agility Pack在类中获取链接

13

有许多带有类别alt的。我想获取所有链接或第一个或最后一个,但使用html agility pack时无法弄清楚如何实现。

我尝试了a的变体,但只能获取所有链接或不获取任何链接。它似乎不能仅获取节点中的链接,这毫无意义,因为我正在编写n.SelectNodes。

html.LoadHtml(page);
var nS = html.DocumentNode.SelectNodes("//tr[@class='alt']");
foreach (var n in nS)
{
  var aS = n.SelectNodes("a");
  ...
}

你能展示一下你尝试解析的HTML代码片段吗?我不是完全清楚你想要做什么。 - jaltiere
@jaltiere:他想要的是CSS选择器tr.alt a - SLaks
2个回答

15
你可以使用LINQ:
var links = html.DocumentNode
           .Descendants("tr")
           .Where(tr => tr.GetAttributeValue("class", "").Contains("alt"))
           .SelectMany(tr => tr.Descendants("a"))
           .ToArray();
请注意,这也会匹配<tr class="Malto">;你可能想要用正则表达式替换Contains调用。
你也可以使用Fizzler:
html.DocumentNode.QuerySelectorAll("tr.alt a");
请注意,这两种方法也会返回非链接的锚点。

11

为什么不在一个查询中选择所有链接:

html.LoadHtml(page);
var nS = html.DocumentNode.SelectNodes("//tr[@class='alt']//a");
foreach(HtmlNode linkNode in nS)
{
//do something
}

对于HTML来说,这是有效的:

<table>
<tr class = "alt">
<td><'a href="link.html">Some Link</a></td>
</tr>
</table>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接