如何使用C# XPath提取指定HTML元素的InnerText值
使用C# XPath提取HTML元素的InnerText值
要在C#里用XPath提取HTML元素的InnerText,直接用.NET自带的XML解析类(比如XmlDocument)容易踩坑——毕竟大部分网页HTML都不是严格的XML格式。我推荐用HtmlAgilityPack这个专门处理HTML的库,下面是具体步骤:
步骤1:安装HtmlAgilityPack
首先通过NuGet安装这个包:
- 打开NuGet包管理器控制台,执行命令:
Install-Package HtmlAgilityPack - 或者在Visual Studio的NuGet包管理器里搜索
HtmlAgilityPack并安装。
步骤2:编写代码解析HTML并提取内容
针对你给出的HTML片段,我整理了完整的示例代码(注意我补全了部分截断的HTML内容,你需要替换成自己的完整HTML):
using HtmlAgilityPack; using System; class Program { static void Main() { // 替换成你的完整HTML内容 string htmlContent = @"<div class=""Lts(1px) Fz(14px) Fs(i) Lh(2.5) Fw(300) Tsh($temperature-text-shadow)""><span>5/3, 12:48 PM</span></div></section><section class=""weather-card C(#fff) M(10px) Pos(a) B(0) Start(0) End(0)"" data-type=""temperature"" data-reactid=""21""><div class=""temperature Fz(14px) Tsh($temperature-text-shadow)"" data-reactid=""22""><div class=""My(2px)"" data-reactid=""23""><span data-code=""30"" class=""Va(m)"" data-reactid=""24"">25°C</span></div></div></section>"; // 初始化HTML文档对象 HtmlDocument htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(htmlContent); // 提取时间文本(对应第一个span的内容) var timeElement = htmlDoc.DocumentNode.SelectSingleNode("//div[@class='Lts(1px) Fz(14px) Fs(i) Lh(2.5) Fw(300) Tsh($temperature-text-shadow)']/span"); if (timeElement != null) { string timeText = timeElement.InnerText; Console.WriteLine($"提取的时间: {timeText}"); // 输出:5/3, 12:48 PM } // 提取温度相关文本(对应data-type为temperature的section下的span) var tempElement = htmlDoc.DocumentNode.SelectSingleNode("//section[@data-type='temperature']//span[@data-code='30']"); if (tempElement != null) { string tempText = tempElement.InnerText; Console.WriteLine($"提取的温度: {tempText}"); } } }
关键说明
- XPath表达式的写法:
- 提取时间的XPath:
//div[@class='Lts(1px) Fz(14px) Fs(i) Lh(2.5) Fw(300) Tsh($temperature-text-shadow)']/span——通过精确匹配div的class属性,定位到它下面的span元素。 - 提取温度的XPath:
//section[@data-type='temperature']//span[@data-code='30']——利用data-type这个自定义属性定位section,再通过data-code定位目标span,这种方式比依赖class更稳定(class可能随样式调整变化)。
- 提取时间的XPath:
- 处理不完整HTML:你提供的HTML片段有
<...截断,实际使用时必须保证HTML结构完整,否则HtmlAgilityPack可能无法正确解析元素。 - 空值判断:一定要加
if (element != null)的判断,避免因为元素找不到导致空引用异常。
内容的提问来源于stack exchange,提问作者Shahzad Naseer
相关产品推荐
相关产品推荐

