Получить ссылки в классе с пакетом гибкости html

c# html-agility-pack

Вопрос

Есть куча tr с классом alt. Я хочу получить все ссылки (или первый из последних), но я не могу понять, как с html agility pack.

Я пробовал варианты, но я получаю только все ссылки или ничего. Кажется, он не только получает тот, что в узле не имеет смысла, так как я пишу n.SelectNodes

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

Принятый ответ

Вы можете использовать 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");

Обратите внимание, что оба метода также возвращают привязки, которые не являются связями.


Популярные ответы

Почему бы не выбрать все ссылки в одном запросе:

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>


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему