0

0

使用 HtmlAgilityPack 精确解析 HTML 文档中的特定表格

心靈之曲

心靈之曲

发布时间:2025-10-23 10:09:01

|

771人浏览过

|

来源于php中文网

原创

使用 HtmlAgilityPack 精确解析 HTML 文档中的特定表格

本教程详细介绍了如何使用 c# 中的 htmlagilitypack 库,从包含多个表格的 html 文档中准确选择并解析特定的 html 表格。文章纠正了常见的 xpath 使用误区,强调了在选定节点上下文中执行查询的重要性,并提供了完整的代码示例,帮助开发者高效、精确地提取所需数据。

在 Web 数据抓取和 HTML 解析任务中,HtmlAgilityPack 是 .NET 开发者常用的强大工具。它能够将 HTML 文档解析成 DOM 结构,并通过 XPath 或 CSS 选择器方便地查询和操作节点。然而,当 HTML 文档包含多个结构相似的元素(例如多个

标签)时,准确地选择并处理其中一个特定元素,而非全部,就显得尤为重要。

理解 XPath 查询上下文

一个常见的错误是,在成功选择了一个父节点(例如一个特定的表格)之后,后续的子节点查询仍然在整个文档的上下文中执行。例如,当您使用 doc.DocumentNode.SelectSingleNode("//table[1]") 选择了第一个表格后,如果接着使用 doc.DocumentNode.SelectNodes("//tr") 来查找行,那么它会返回文档中 所有

元素,而不仅仅是第一个表格中的行。

要解决这个问题,关键在于理解 XPath 查询的上下文。一旦您选择了一个特定的 HtmlNode,后续针对该节点内部元素的查询应该以该节点为上下文进行。

准确选择和解析特定表格

以下是一个示例 HTML 结构,我们将以此为例来演示如何分别解析第一个和第二个表格:

立即学习前端免费学习笔记(深入)”;


    
        

This is where first table starts

Uni-CourseHelper
Uni-CourseHelper

私人AI助教,高效学习工具

下载
head1 head2
data1_1 data1_2
data1_3 data1_4

This is where second table starts

headA headB
data2_A data2_B
data2_C data2_D

我们将使用 HtmlAgilityPack 来加载这个 HTML,并根据需要选择不同的表格。

1. 解析第一个表格

要解析第一个表格,我们首先需要使用 XPath //table[1] 准确地选中它。然后,所有后续的行 (

) 和单元格 () 查询都应该在 这个选定的表格节点 的上下文中进行。
using HtmlAgilityPack;
using System.Data;
using System.Linq; // For .Skip()

public class TableParser
{
    public DataTable ParseFirstTable(string htmlContent)
    {
        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(htmlContent);

        DataTable dt = new DataTable();
        // 假设我们知道表格结构,预先定义列
        dt.Columns.Add("ColumnA", typeof(string));
        dt.Columns.Add("ColumnB", typeof(string));

        // 选中第一个表格节点
        HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[1]");

        if (table != null)
        {
            // 在选定的 'table' 节点内部查找所有的 'tr' 节点
            // 注意:这里使用 "tr" 或 ".//tr" 而不是 "//tr"
            // "tr" 表示直接子元素,".//tr" 表示当前节点下的任意后代元素
            // 考虑到表格结构,"tr" 通常是更精确和高效的选择
            var rows = table.SelectNodes("tr"); 

            if (rows != null)
            {
                // 跳过表头行(如果有的话),从第二行开始处理数据
                foreach (var row in rows.Skip(1)) // 假设第一行是表头
                {
                    var cells = row.SelectNodes("td"); // 在当前行 'row' 内部查找 'td' 节点
                    if (cells != null && cells.Count >= 2) // 确保有足够的单元格
                    {
                        string colA = cells[0].InnerText.Trim();
                        string colB = cells[1].InnerText.Trim();
                        dt.Rows.Add(colA, colB);
                    }
                }
            }
        }
        return dt;
    }
}

2. 解析第二个表格

解析第二个表格的方法与第一个表格类似,只需将 XPath 表达式改为 //table[2] 即可。

using HtmlAgilityPack;
using System.Data;
using System.Linq;

public class TableParser
{
    // ... (ParseFirstTable 方法省略) ...

    public DataTable ParseSecondTable(string htmlContent)
    {
        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(htmlContent);

        DataTable dt = new DataTable();
        // 假设我们知道表格结构,预先定义列
        dt.Columns.Add("ColumnX", typeof(string));
        dt.Columns.Add("ColumnY", typeof(string));

        // 选中第二个表格节点
        HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[2]");

        if (table != null)
        {
            var rows = table.SelectNodes("tr");

            if (rows != null)
            {
                foreach (var row in rows.Skip(1)) // 假设第一行是表头
                {
                    var cells = row.SelectNodes("td");
                    if (cells != null && cells.Count >= 2)
                    {
                        string colX = cells[0].InnerText.Trim();
                        string colY = cells[1].InnerText.Trim();
                        dt.Rows.Add(colX, colY);
                    }
                }
            }
        }
        return dt;
    }
}

关键注意事项

  1. XPath 上下文: 始终记住,SelectSingleNode 或 SelectNodes 方法如果在 HtmlDocument.DocumentNode 上调用,则会在整个文档中搜索;如果在特定的 HtmlNode 上调用,则会在该节点的子树中搜索。
    • //element:在文档的任何位置查找 element。
    • element:查找当前节点的直接子 element。
    • .//element:在当前节点的所有后代中查找 element。
  2. 索引从 1 开始: XPath 索引是基于 1 的,所以 [1] 表示第一个元素,[2] 表示第二个元素。
  3. 健壮性: 在实际应用中,HTML 结构可能不总是完美的。在访问 SelectNodes 或 SelectSingleNode 的结果之前,务必进行空值检查(if (node != null)),以避免 NullReferenceException。
  4. 表头处理: 示例代码使用 rows.Skip(1) 来跳过表头行。如果表头使用 标签,并且您想单独处理或忽略它们,可以更精确地筛选 元素,例如只选择包含 的行。
  5. 更精确的定位: 如果表格有 id 或 class 属性,使用这些属性进行定位会更加稳定和精确,例如 //table[@id='myTableId'] 或 //table[@class='data-table']。
  6. 通过遵循这些原则,您可以有效地利用 HtmlAgilityPack 从复杂的 HTML 文档中提取所需的数据,并确保解析过程的准确性和健壮性。理解 XPath 上下文是掌握 HtmlAgilityPack 进行高级数据抓取的基石。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css
css

css是层叠样式表,用来表现HTML或XML等文件样式的计算机语言,不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

525

2023.06.15

css居中
css居中

css居中:1、通过“margin: 0 auto; text-align: center”实现水平居中;2、通过“display:flex”实现水平居中;3、通过“display:table-cell”和“margin-left”实现居中。本专题为大家提供css居中的相关的文章、下载、课程内容,供大家免费下载体验。

268

2023.07.27

css如何插入图片
css如何插入图片

cssCSS是层叠样式表(Cascading Style Sheets)的缩写。它是一种用于描述网页或应用程序外观和样式的标记语言。CSS可以控制网页的字体、颜色、布局、大小、背景、边框等方面,使得网页的外观更加美观和易于阅读。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

761

2023.07.28

css超出显示...
css超出显示...

在CSS中,当文本内容超出容器的宽度或高度时,可以使用省略号来表示被隐藏的文本内容。本专题为大家提供css超出显示...的相关文章,相关教程,供大家免费体验。

542

2023.08.01

css字体颜色
css字体颜色

CSS中,字体颜色可以通过属性color来设置,用于控制文本的前景色,字体颜色在网页设计中起到很重要的作用,具有以下表现作用:1、提升可读性;2、强调重点信息;3、营造氛围和美感;4、用于呈现品牌标识或与品牌形象相符的风格。

765

2023.08.10

什么是css
什么是css

CSS是层叠样式表(Cascading Style Sheets)的缩写,是一种用于描述网页(或其他基于 XML 的文档)样式与布局的标记语言,CSS的作用和意义如下:1、分离样式和内容;2、页面加载速度优化;3、实现响应式设计;4、确保整个网站的风格和样式保持统一。

606

2023.08.10

css三角形怎么写
css三角形怎么写

CSS可以通过多种方式实现三角形形状,本专题为大家提供css三角形怎么写的相关教程,大家可以免费体验。

561

2023.08.21

css设置文字颜色
css设置文字颜色

CSS(层叠样式表)可以用于设置文字颜色,这样做有以下好处和优势:1、增加网页的可视化效果;2、突出显示某些重要的信息或关键字;3、增强品牌识别度;4、提高网页的可访问性;5、引起不同的情感共鸣。

397

2023.08.22

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

9

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

CSS教程
CSS教程

共754课时 | 24.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号