【问题标题】:HtmlAgilityPack parse attributesHtmlAgilityPack 解析属性
【发布时间】:2015-07-12 13:11:00
【问题描述】:

我正在尝试解析 HTML,但我不知道如何使用条件(例如,类名必须是 X)。我知道有很多关于敏捷包的主题,但我找不到任何有用的主题。

<div class="main-class">
<a href="LINK">
<img src="IMAGELINK" alt="SOMETEXT" class="image-class">
</a>
</div>

<p> bla bla </p>

<div class="main-class">
<a href="LINK">
<img src="IMAGELINK" alt="SOMETEXT" class="image-class">
</a>
</div>

<div class="main-class">
<a href="LINK">
<img src="IMAGELINK" alt="SOMETEXT" class="image-class">
</a>
<p> asd sadh awww </p>
</div>

我想为每个类名为“main-class”的 div 获取 href、src 和 alt, 这是我的代码,但它只打印“p”,因为这是我唯一知道该怎么做的事情。

      HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(dataString);
         foreach (HtmlNode nodeItem in doc.DocumentNode.Descendants("p").ToArray())
          {
              Debug.WriteLine(nodeItem.InnerText);
          }

我正在开发不支持“SelectNodes”的 WP 应用

【问题讨论】:

    标签: c# html-agility-pack


    【解决方案1】:

    通过使用传统的 Non-XPath 方式。

    注意:检查可空值被省略。

    string dataString = "<div class=\"main-class\"><a href=\"LINK\"><img src=\"IMAGELINK\" alt=\"SOMETEXT\" class=\"image-class\"></a></div><p> bla bla </p><div class=\"main-class\"><a href=\"LINK\"><img src=\"IMAGELINK\" alt=\"SOMETEXT\" class=\"image-class\"></a></div><div class=\"main-class\"><a href=\"LINK\"><img src=\"IMAGELINK\" alt=\"SOMETEXT\" class=\"image-class\"></a><p> asd sadh awww </p></div>";
    
    var doc = new HtmlDocument();
    doc.LoadHtml(dataString);
    
    var elements = doc.DocumentNode.Descendants("div").Where(o => o.GetAttributeValue("class", "") == "main-class");
    foreach (var nodeItem in elements)
    {
        var aTag = nodeItem.Descendants("a").First();
        var aTagHrefValue = aTag.Attributes["href"];
    
        var imgTag = nodeItem.Descendants("img").First();
        var imgTagSrcValue = imgTag.Attributes["src"];
        var imgTagAltValue = imgTag.Attributes["alt"];
    
        Console.WriteLine("a href value: {0}", aTagHrefValue.Value);
        Console.WriteLine("img src value: {0}", imgTagSrcValue.Value);
        Console.WriteLine("img alt value: {0}", imgTagAltValue.Value);
        Console.WriteLine();
    }
    

    【讨论】:

      【解决方案2】:

      @Orel Eraki - 谢谢。我在 3 分钟前自己做了,但我会使用你的解决方案,因为它只有一个 foreach 循环。无论如何,这是我的解决方案

           foreach (HtmlNode nodeItem in doc.DocumentNode.Descendants("div").Where(p => p.GetAttributeValue("class", "def").Equals("main-class")))
               {
                   foreach (HtmlNode nodeAItem in nodeItem.Descendants("a"))
                   {
                      Debug.WriteLine(nodeAItem.GetAttributeValue("href", "def"));
                      foreach (HtmlNode nodeIMAGEitem in nodeAItem.Descendants("img"))
                       {
                           Debug.WriteLine(nodeIMAGEitem.GetAttributeValue("src", "def"));
                           Debug.WriteLine(nodeIMAGEitem.GetAttributeValue("alt", "def"));
                       }                    
                   }
                }
      

      【讨论】:

        【解决方案3】:

        您可以为此使用 LINQ

        var attrs = doc.DocumentNode
                       .Descendants("div")
                       .Where(d => d.Attributes != null &&
                                   d.Attributes.Contains("class") &&
                                   d.Attributes["class"].Value.Contains("main-class"))
                       .Select(d => new
                       {
                           anchor = d.SelectSingleNode("a"),
                           img = d.SelectSingleNode("a") != null 
                                                         ? d.SelectSingleNode("a").SelectSingleNode("img") 
                                                         : null 
                       })
                       .Select(d => new
                       {
                           href = d.anchor != null 
                                           ? d.anchor.GetAttributeValue("href", string.Empty) 
                                           : string.Empty,
                           imgsrc = d.img != null 
                                          ? d.img.GetAttributeValue("src", string.Empty) 
                                          : string.Empty,
                           imgalt = d.img != null 
                                          ? d.img.GetAttributeValue("alt", string.Empty) 
                                          : string.Empty
                       })
                       .ToList();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-23
          • 2012-09-27
          • 1970-01-01
          • 2010-11-23
          • 2012-02-15
          • 1970-01-01
          相关资源
          最近更新 更多