如何使用C# HtmlAgilityPack提取网页指定结构中的‘223M’文本
使用C#的HtmlAgilityPack提取指定文本的实现方法
准备工作
先通过NuGet安装HtmlAgilityPack包:
- 打开NuGet包管理器控制台,执行命令:
Install-Package HtmlAgilityPack - 或者在Visual Studio的NuGet包管理器中搜索“HtmlAgilityPack”完成安装
实现思路
目标文本“223M”位于data-id="net_premium"的<div>容器内的<h3>标签中。如果直接通过data-app="summary-value"定位,会拿到第一个<h3>的“Bullish”,所以更准确的方式是先定位到data-id="net_premium"的容器,再提取其中的<h3>文本。
代码实现
方式1:使用XPath定位
using HtmlAgilityPack; using System; class Program { static void Main() { // 待解析的HTML内容 string html = @"<div data-widget=""quote-options-flow-summary"" data-mode=""desktop"" data-symbol=""AAPL""> <div class=""options-flow-summary""> <div data-app=""summary-element"" data-id=""overall_flow""> <h2 class=""summary-type""> Overall Flow <i class=""fas fa-info-circle"" title=""Determined based on positive or negative net premiums.""> </i> </h2> <h3 data-app=""summary-value"" style=""color:#009c3d""> Bullish </h3> </div> <div data-app=""summary-element"" data-id=""net_premium""> <h2 class=""summary-type""> Net Premium <i class=""fas fa-info-circle"" title=""Calculated value of calls premium minus put premium in the filtered Flow.""> </i> </h2> <h3 data-app=""summary-value"" style=""color:#009c3d""> 223M </h3> </div> </div> </div>"; HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(html); // 用XPath定位目标h3标签 HtmlNode targetNode = doc.DocumentNode.SelectSingleNode("//div[@data-id='net_premium']//h3[@data-app='summary-value']"); if (targetNode != null) { // 去除文本中的换行和多余空格 string result = targetNode.InnerText.Trim(); Console.WriteLine(result); // 输出:223M } else { Console.WriteLine("未找到目标元素"); } } }
方式2:使用LINQ查询
using HtmlAgilityPack; using System; using System.Linq; class Program { static void Main() { string html = @"[此处粘贴上述HTML内容]"; HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(html); // 先定位到data-id为net_premium的div,再查找内部的h3标签 var targetNode = doc.DocumentNode .Descendants("div") .FirstOrDefault(d => d.GetAttributeValue("data-id", "") == "net_premium")? .Descendants("h3") .FirstOrDefault(h => h.GetAttributeValue("data-app", "") == "summary-value"); if (targetNode != null) { string result = targetNode.InnerText.Trim(); Console.WriteLine(result); // 输出:223M } else { Console.WriteLine("未找到目标元素"); } } }
关键说明
- 优先通过
data-id="net_premium"定位容器,是因为这个属性唯一对应“Net Premium”模块,避免和其他模块的同属性标签混淆 - 使用
Trim()方法是为了去除HTML中换行、缩进带来的多余空白字符 - 两种方式都做了空值判断,防止找不到元素时出现空引用异常
内容的提问来源于stack exchange,提问作者Yu Deng
相关产品推荐
相关产品推荐

