首页 > 解决方案 > 使用 htmlagilitypack 解析单个项目中的 HTML 类

问题描述

我想解析 HTML,我使用了以下代码,但我将所有这些都放在一个项目中,而不是单独获取项目

var url = "https://subscene.com/subtitles/searchbytitle?query=joker&l=";
var web = new HtmlWeb();
var doc = web.Load(url);
IEnumerable<HtmlNode> nodes =
   doc.DocumentNode.Descendants()
     .Where(n => n.HasClass("search-result"));

foreach (var item in nodes)
{
    string itemx = item.SelectSingleNode(".//a").Attributes["href"].Value;

    MessageBox.Show(itemx);
    MessageBox.Show(item.InnerText);

}

我只收到第一项的一条消息,第二条消息显示所有项目

标签: c#html-agility-pack

解决方案


当您根据类“search-result”从 url 中搜索数据时,只返回一个节点。而不是遍历它的孩子,你只通过那个 div,这就是为什么你只得到一个结果。

如果您想获取具有“search-result”类的 div 内所有链接的列表,则可以执行以下操作。

代码:

    string url = "https://subscene.com/subtitles/searchbytitle?query=joker&l=";
    HtmlWeb web = new HtmlWeb();
    HtmlDocument doc = web.Load(url);

    List<string> listOfUrls = new List<string>();
    HtmlNode searchResult = doc.DocumentNode.SelectSingleNode("//div[@class='search-result']");

    // Iterate through all the child nodes that have the 'a' tag.
    foreach (HtmlNode node in searchResult.SelectNodes(".//a"))
    {
        string thisUrl = node.GetAttributeValue("href", "");
        if (!string.IsNullOrEmpty(thisUrl) && !listOfUrls.Contains(thisUrl))
            listOfUrls.Add(thisUrl);
    }

它有什么作用?

  1. SelectSingleNode("//div[@class='search-result']")-> 检索包含所有搜索结果的 div 并忽略文档的其余部分。
  2. 仅遍历其中包含的所有“子节点”href并将其添加到列表中。子节点是根据点符号确定的SelectNodes(".//a")(而不是.//,如果你这样做//,它将搜索整个页面,这不是你想要的)。
  3. If 语句确保它只添加唯一的非空值。

您现在拥有所有链接。

小提琴: https ://dotnetfiddle.net/j5aQFp


推荐阅读