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属性が存在する場合、それを取得する方法は他にありますか?
「/ img [@alt]」からフォワードスラッシュプレフィックスを削除する必要があります。これは、ドキュメントのルートから開始することを示しているためです。
HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
Xpathクエリでは、「。」も使用できます。現在のノードから検索を開始することを示します。
HtmlNode imageNode = linkNode.SelectSingleNode(".//img[@alt]");
また、ヌルチェックにも注意してください。 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]");**
}
}
}