使用HtmlAgilityPack从<a>节点中选择href

时间:2019-12-15 12:19:22

标签: c# html nodes html-agility-pack

我正在尝试使用C#中的Htmlagilitypack学习网络爬网并从“ a”节点获取href值。 gridview中有多个Gridcell,其中的文章具有较小的单元格,我希望所有这些单元格都具有“ a”节点href值

<div class=Tabpanel>
    <div class=G ridW>
        <div class=G ridCell>
            <article>
                <div class=s mallerCell>
                    <a href="..........">
                </div>
            </article>
        </div>
    </div>
    <div class=r andom>
    </div>
    <div class=r andom>
    </div>
</div>

这是我到目前为止提出的,感觉就像我使它变得比必须的更加复杂。我从这里去哪里?还是有一种更简单的方法?

httpclient = new HttpClient();
var html = await httpclient.GetStringAsync(Url);

var htmldoc = new HtmlDocument();
htmldoc.LoadHtml(html);

var ReceptLista = new List < HtmlNode > ();
ReceptLista = htmldoc.DocumentNode.Descendants("div")
    .Where(node => node.GetAttributeValue("class", "")
        .Equals("GridW")).ToList();

var finalList = new List < HtmlNode > ();
finalList = ReceptLista[0].Descendants("article").ToList();

var finalList2 = new List < List < HtmlNode >> ();
for (int i = 0; i < finalList.Count; i++) {
    finalList2.Add(finalList[i].DescendantNodes().Where(node => node.GetAttributeValue("class", "").Equals("RecipeTeaser-content")).ToList());
}

var finalList3 = new List < List < HtmlNode >> ();

for (int i = 0; i < finalList2.Count; i++) {
    finalList3.Add(finalList2[i].Where(node => node.GetAttributeValue("class", "").Equals("RecipeTeaser-link js-searchRecipeLink")).ToList());
}

2 个答案:

答案 0 :(得分:0)

如果您可以使用XPath使事情变得简单得多。

如果要使用article标签中的所有链接,则可以执行以下操作。

var anchors = htmldoc.SelectNodes("//article/a");
var links = anchors.Select(a=>a.attributes["href"].Value).ToList();

我认为是Value。检查文档。

如果仅需要作为文章子项的锚标记,并且也需要类smallerCell,则可以将xpath更改为//article/div[@class='smallerClass']/a

您明白了。我认为您只是缺少xpath知识。另外请注意,HtmlAgilityPack还具有可以添加CSS选择器的插件,因此如果您不想执行xpath,这也是一个选择。

答案 1 :(得分:0)

我要做的最简单的方法就是这个...

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(text);
    var nodesWithARef = doc.DocumentNode.Descendants("a");

    foreach (HtmlNode node in nodesWithARef)
    {
        Console.WriteLine(node.GetAttributeValue("href", ""));
    }

原因:使用后代函数将为您提供整个html中您感兴趣的所有链接的数组。您可以遍历节点并执行所需的操作……我只是在打印href。

另一种方法是要查找所有具有名为“ smallerCell”类的节点。然后,对于这些节点中的每个节点,查找href,如果存在该href并进行打印(或对其进行处理)。

    var nodesWithSmallerCells = doc.DocumentNode.SelectNodes("//div[@class='smallerCell']");
    if (nodesWithSmallerCells != null)
        foreach (HtmlNode node in nodesWithSmallerCells)
        {
            HtmlNodeCollection children = node.SelectNodes(".//a");
            if (children != null)
                foreach (HtmlNode child in children)
                    Console.WriteLine(child.GetAttributeValue("href", ""));
        }