如何使用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
相关产品推荐
相关产品推荐

