40

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 属性を取得できる他の方法はありますか?

4

3 に答える 3

43

ドキュメントのルートから開始することを意味するため、「/img[@alt]」からスラッシュ接頭辞を削除する必要があります。

HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
于 2009-05-13T10:46:27.703 に答える
42

xpath クエリでは、"." も使用できます。現在のノードから検索を開始する必要があることを示します。

HtmlNode imageNode = linkNode.SelectSingleNode(".//img[@alt]");
于 2010-11-18T04:30:51.880 に答える
10

また、Null チェックにも注意してください。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]");**   
     }
  }
}
于 2009-05-13T12:33:00.293 に答える