我正在尝试使用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());
}
答案 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", ""));
}