html agility packでクラス内のリンクを取得する

c# html-agility-pack

質問

クラスaltにはたくさんのtrがあります。私はすべてのリンク(または最後の最初の)を取得したいのですが、htmlの敏捷性パックでどのように把握できません。

私は変種を試してみましたが、私はすべてのリンクを取得するだけです。それは、私は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呼び出しを正規表現に置き換えることができContains

Fizzlerを使うこともできます

var links = html.DocumentNode
           .Descendants("tr")
           .Where(tr => tr.GetAttributeValue("class", "").Contains("alt"))
           .SelectMany(tr => tr.Descendants("a"))
           .ToArray();

両方のメソッドがリンクではないアンカーも返すことに注意してください。


人気のある回答

1つのクエリですべてのリンクを選択しないでください:

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

htmlには有効です:

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



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ