HtmlAgilityPack获取DIV内的所有链接

7

我希望能够从一个div中获取2个链接。

目前我只能选择一个,但当有多个时似乎不起作用。

HtmlWeb web = new HtmlWeb();
        HtmlDocument doc = web.Load(url);

HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='myclass']");

            if (node != null)
            {
                foreach (HtmlNode type in node.SelectNodes("//a@href"))
                {
                    recipe.type += type.InnerText;
                }
            }
            else
                recipe.type = "Error fetching type.";

试图从这段HTML代码中获取它:

<div class="myclass">
<h3>Not Relevant Header</h3>
    <a href="#">This text</a>, 
    <a href="#">and this text</a>
</div>

非常感谢您的帮助,提前致谢。


Deejdd,您可能会对看到一个更通用的解决方案感兴趣,它可以在更多情况下成功使用。 - Dimitre Novatchev
3个回答

17
var div = doc.DocumentNode.SelectSingleNode("//div[@class='myclass']");
if(div!=null)
{
     var links = div.Descendants("a")
                    .Select(a => a.InnerText)
                    .ToList();
}

已经测试过了,但出于某些原因它获取了选定 div 以外的所有链接。 - Deejdd
3
非常感谢,它起作用了,由于声望不够不能给你点赞。 - Deejdd

4

使用这个XPath:

//div[@class = 'myclass']//a

它获取所有 class = 'myclass'div 中的后代 a 元素。

//a@href 是不正确的 XPath。


一个小问题,是否可以这样做://div[@class = 'half na']如果您不知道确切的类名仍然要搜索它。 - Deejdd
@Deejdd,你能澄清一下吗?从你的例子中可以知道@class = 'half na' - Kirill Polishchuk
假设该类的名称是“half name”,但我只知道一半的“na”,是否仍然可以搜索到该 div 元素? - Deejdd
1
@Deejdd,是的,请使用contains函数,例如://div[contains(@class, 'known-part')] - Kirill Polishchuk
太棒了,我不知道在xpath中可以使用contains。谢谢。 - Deejdd

2

用途:

//div[contains(concat(' ', @class, ' '), ' myclass ')]//a

这个选择器选取的是任何一个 class 属性包含类名为 "myclass"div 元素的后代元素中的 a 元素。
这个类名可以是唯一的,也可以是其他类名中的一个。在这种情况下,类名可能是第一个、最后一个或者被其他类名包围。上面的 XPath 表达式正确地选择了所有这些不同情况下所需的节点。

感谢您的发布,很高兴看到不同的方法来实现相同的结果。 - Deejdd
@Deejdd,欢迎。您是否注意到这个解决方案比其他答案更强大、更适用?即使某些div的class属性形式为"class="class1 myclass class2"",它也能选择所需的节点——而所有其他答案都无法在任何这种情况下正确选择所需的节点。 - Dimitre Novatchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接