You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AngleSharp解析维基百科《航空公司列表》页面的表格?

用AngleSharp解析维基百科航空公司列表表格

嘿,我来帮你搞定用AngleSharp解析这个表格的事儿!比起正则表达式,AngleSharp能更优雅地处理HTML结构,不用头疼各种标签嵌套的问题。下面是完整的实现步骤:

1. 先安装AngleSharp包

首先得把AngleSharp加到你的项目里,用NuGet的话,在包管理器控制台执行:

Install-Package AngleSharp

或者用.NET CLI命令:

dotnet add package AngleSharp

2. 核心解析代码示例

这是完整的解析逻辑,我们会精准定位到那个wikitable sortable的表格,然后逐行提取数据:

using AngleSharp;
using AngleSharp.Dom;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // 创建浏览上下文配置,启用默认加载器
        var config = Configuration.Default.WithDefaultLoader();
        var browsingContext = BrowsingContext.New(config);

        // 加载目标页面(替换成维基百科《航空公司列表》的实际URL)
        var document = await browsingContext.OpenAsync("这里替换为目标页面的URL");

        // 定位到标题为"Airline codes"的目标表格
        var tableCaption = document.QuerySelector("table.wikitable.sortable caption:contains('Airline codes')");
        if (tableCaption == null)
        {
            System.Console.WriteLine("未找到目标表格,请检查页面结构或选择器");
            return;
        }

        // 获取表格元素本身
        var targetTable = tableCaption.ParentElement;

        // 提取表头文本
        var headers = targetTable.QuerySelectorAll("thead th")
                                 .Select(th => th.TextContent.Trim())
                                 .ToList();

        // 遍历所有数据行(跳过表头行)
        foreach (var row in targetTable.QuerySelectorAll("tbody tr"))
        {
            // 提取当前行的所有单元格文本
            var cellContents = row.QuerySelectorAll("td")
                                  .Select(td => td.TextContent.Trim())
                                  .ToList();

            // 确保单元格数量和表头匹配,避免无效行
            if (cellContents.Count != headers.Count)
                continue;

            // 将表头和单元格内容关联成字典,方便后续处理
            var airlineInfo = new Dictionary<string, string>();
            for (int i = 0; i < headers.Count; i++)
            {
                airlineInfo[headers[i]] = cellContents[i];
            }

            // 这里可以根据需求处理数据,比如打印示例信息
            System.Console.WriteLine($"航空公司:{airlineInfo["Airline"]} | 国家:{airlineInfo["Country"]} | IATA代码:{airlineInfo["IATA"]}");
        }
    }
}

关键细节说明

  • 精准定位表格:用CSS选择器table.wikitable.sortable caption:contains('Airline codes')先找到表格的标题元素,再通过ParentElement拿到表格本身,这样能避开页面中其他同类表格的干扰。
  • 提取干净数据:用TextContent.Trim()去除文本前后的空格、换行符,确保拿到的内容整洁。
  • 异步处理:OpenAsync是异步方法,所以整个逻辑要放在async方法中运行(比如示例里的Main方法)。

小提示

如果之后发现解析失效了,大概率是维基百科的页面结构有变动,这时候只需要调整CSS选择器来匹配新的页面结构就行,比维护正则表达式简单多了。

内容的提问来源于stack exchange,提问作者Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:30:02