【问题标题】:HTMLAgilityPack iterate all text nodes onlyHTMLAgilityPack 仅迭代所有文本节点
【发布时间】:2011-06-14 14:03:27
【问题描述】:

这是一个 HTML sn-p,我想要的只是获取文本节点并迭代它们。请告诉我。谢谢。

<div>
   <div>
      Select your Age:
      <select>
          <option>0 to 10</option>
          <option>20 and above</option>
      </select>
   </div>
   <div>
       Help/Hints:
       <ul>
          <li>This is required field.
          <li>Make sure select the right age.
       </ul>
      <a href="#">Learn More</a>
   </div>
</div>

结果:

  1. 选择您的年龄:
  2. 0 到 10
  3. 20及以上
  4. 帮助/提示:
  5. 这是必填字段。
  6. 确保选择正确的年龄。
  7. 了解详情

【问题讨论】:

    标签: html-agility-pack


    【解决方案1】:

    类似这样的:

        HtmlDocument doc = new HtmlDocument();
        doc.Load(yourHtmlFile);
    
        foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()[normalize-space(.) != '']"))
        {
            Console.WriteLine(node.InnerText.Trim());
        }
    

    会输出这个:

    Select your Age:
    0 to 10
    20 and above
    Help/Hints:
    This is required field.
    Make sure select the right age.
    Learn More
    

    【讨论】:

      【解决方案2】:

      我在 Google 主页上测试了 @Simon Mourier 的答案,得到了很多 CSS 和 Javascript,所以我添加了一个额外的过滤器来删除它:

          public string getBodyText(string html)
          {
              string str = "";
      
              HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
              doc.LoadHtml(html);
      
              try
              {
                  // Remove script & style nodes
                  doc.DocumentNode.Descendants().Where( n => n.Name == "script" || n.Name == "style" ).ToList().ForEach(n => n.Remove());
      
                  // Simon Mourier's Answer
                  foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()[normalize-space(.) != '']"))
                  {
                      str += node.InnerText.Trim() + " ";
                  }
              }
              catch (Exception)
              {
              }
      
              return str;
          }
      

      【讨论】:

      • 尝试实现您的代码时,我在 n.Remove() 上收到“BC30491:表达式不产生值”错误
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多