web-dev-qa-db-ja.com

HtmlAgilityPackがchildNodesを期待どおりに選択しない

HtmlAgilityPackライブラリを使用してページ内のいくつかのリンクを解析しようとしていますが、メソッドから期待する結果が表示されません。以下に、リンクのHtmlNodeCollectionがあります。各リンクについて、画像ノードがあるかどうかを確認してからその属性を解析しますが、linkNodeのSelectNodesメソッドとSelectSingleNodeメソッドは、linkNodeのchildNodesではなく親ドキュメントを検索しているようです。

HtmlDocument htmldoc = new HtmlDocument();
htmldoc.LoadHtml(content);
HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");

foreach(HtmlNode linkNode in linkNodes)
{
    string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
    if (linkTitle == string.Empty)
    {
        HtmlNode imageNode = linkNode.SelectSingleNode("/img[@alt]");     
    }
}

LinkNodeの画像の子ノードのalt属性が存在する場合、それを取得する方法は他にありますか?

38
Sheff

「/ img [@alt]」からフォワードスラッシュプレフィックスを削除する必要があります。これは、ドキュメントのルートから開始することを示しているためです。

HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
39
Richard Szalay

Xpathクエリでは、「。」も使用できます。現在のノードから検索を開始することを示します。

HtmlNode imageNode = linkNode.SelectSingleNode(".//img[@alt]");
40
ulty4life

また、ヌルチェックにも注意してください。 SelectNodesは、空白のコレクションではなくnullを返します。

HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");

**if(linkNodes!=null)**
{
   foreach(HtmlNode linkNode in linkNodes)
  {
     string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
     if (linkTitle == string.Empty)
     {
       **HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");**   
     }
  }
}
10
msqr