AngleSharp 是一個(gè)功能強(qiáng)大的 .NET 庫,用于解析 HTML、XML 和 CSS。它提供了一個(gè)直觀的 API,使得在 C# 中處理 Web 文檔變得簡單高效。本文將詳細(xì)介紹 AngleSharp 的使用方法,并提供多個(gè)實(shí)用的例子。
1. 安裝
首先,通過 NuGet 包管理器安裝 AngleSharp:
Install-Package AngleSharp
2. 基本用法
2.1 解析 HTML 文檔
using AngleSharp;
using AngleSharp.Dom;
using System;
class Program
{
static async Task Main(string[] args)
{
// 配置 AngleSharp
var config = Configuration.Default;
// 創(chuàng)建一個(gè)新的上下文
var context = BrowsingContext.New(config);
// 解析 HTML 字符串
var html = "<html><body><h1>Hello, AngleSharp!</h1></body></html>";
var document = await context.OpenAsync(req => req.Content(html));
// 獲取并打印 h1 元素的文本
var h1 = document.QuerySelector("h1");
Console.WriteLine(h1.TextContent); // 輸出: Hello, AngleSharp!
}
}
2.2 從 URL 加載文檔
static async Task Main(string[] args)
{
var config = Configuration.Default.WithDefaultLoader();
var context = BrowsingContext.New(config);
var document = await context.OpenAsync("https://www.163.com");
var title = document.QuerySelector("title");
Console.WriteLine($"Page title: {title.TextContent}");
}
3. 高級(jí)用法
3.1 選擇元素
AngleSharp 支持多種選擇元素的方法:
static async Task Main(string[] args)
{
var config = Configuration.Default.WithDefaultLoader();
var context = BrowsingContext.New(config);
var document = await context.OpenAsync("https://www.cnblogs.com/");
// 通過 ID 選擇
var elementById = document.GetElementById("myId");
// 通過類名選擇
var elementsByClass = document.GetElementsByClassName("post-item-title");
foreach (var element in elementsByClass)
{
Console.WriteLine(element.TextContent);
}
// 通過標(biāo)簽名選擇
var elementsByTag = document.GetElementsByTagName("div");
// 使用 CSS 選擇器
var elementBySelector = document.QuerySelectorAll(".post-item-text > p");
foreach (var element in elementBySelector)
{
Console.WriteLine(element.TextContent);
}
var elementsBySelector = document.QuerySelectorAll("div.myClass");
foreach (var element in elementsBySelector)
{
Console.WriteLine(element.TextContent);
}
}
3.2 修改文檔
AngleSharp 允許你動(dòng)態(tài)修改文檔:
static async Task Main(string[] args)
{
var config = Configuration.Default.WithDefaultLoader();
var context = BrowsingContext.New(config);
var document = await context.OpenAsync(req => req.Content("<html><body></body></html>"));
var body = document.Body;
// 創(chuàng)建新元素
var newDiv = document.CreateElement("div");
newDiv.ClassName = "newClass";
newDiv.TextContent = "This is a new div";
// 添加到文檔
body.AppendChild(newDiv);
// 修改現(xiàn)有元素
var existingDiv = document.QuerySelector("div");
existingDiv.SetAttribute("data-custom", "value");
// 刪除元素
var elementToRemove = document.QuerySelector(".removeMe");
elementToRemove?.Remove();
Console.WriteLine(document.DocumentElement.OuterHtml);
}
3.3 處理表單
AngleSharp 可以用來處理 HTML 表單:
static async Task Main(string[] args)
{
var config = Configuration.Default.WithDefaultLoader();
var context = BrowsingContext.New(config);
var html = @"
<form id='loginForm'>
<input type='text' name='username' />
<input type='password' name='password' />
<input type='submit' value='Login' />
</form>";
var document = await context.OpenAsync(req => req.Content(html));
var form = document.QuerySelector("#loginForm") as IHtmlFormElement;
var usernameInput = form["username"] as IHtmlInputElement;
var passwordInput = form["password"] as IHtmlInputElement;
usernameInput.Value = "myUsername";
passwordInput.Value = "myPassword";
// 模擬表單提交
await form.SubmitAsync();
}
3.4 使用 CSS 選擇器
AngleSharp 支持復(fù)雜的 CSS 選擇器:
var html = @"
<div>
<p>First paragraph</p>
<p>Second paragraph</p>
<p>Third paragraph</p>
</div>";
var document = await context.OpenAsync(req => req.Content(html));
// 選擇第二個(gè)段落
var secondP = document.QuerySelector("p:nth-child(2)");
Console.WriteLine(secondP.TextContent); // 輸出: Second paragraph
// 選擇帶有特定類的段落
var highlightedP = document.QuerySelector("p.highlight");
Console.WriteLine(highlightedP.TextContent); // 輸出: Second paragraph
// 選擇所有段落
var allParagraphs = document.QuerySelectorAll("p");
foreach (var p in allParagraphs)
{
Console.WriteLine(p.TextContent);
}
3.5 解析和操作 CSS
AngleSharp 也可以用來解析和操作 CSS:
static async Task Main(string[] args)
{
var config = Configuration.Default.WithDefaultLoader();
var context = BrowsingContext.New(config);
var css = @"
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
}
.highlight {
color: red;
font-weight: bold;
}";
var parser = new CssParser();
var stylesheet = parser.ParseStyleSheet(css);
foreach (var rule in stylesheet.Rules)
{
if (rule is ICssStyleRule styleRule)
{
Console.WriteLine($"Selector: {styleRule.SelectorText}");
foreach (var declaration in styleRule.Style)
{
Console.WriteLine($" {declaration.Name}: {declaration.Value}");
}
}
}
}
3.6 執(zhí)行 JavaScript
雖然 AngleSharp 主要用于 HTML 和 CSS 解析,但它也提供了一個(gè)基本的 JavaScript 執(zhí)行環(huán)境:
static async Task Main(string[] args)
{
var config = Configuration.Default.WithJs();
var context = BrowsingContext.New(config);
var document = await context.OpenAsync(req => req.Content("<div id='result'></div>"));
var script = @"
document.getElementById('result').textContent = 'Hello from JavaScript!';
";
var engine = context.GetService<JsScriptingService>();
var jsValue = engine.EvaluateScript(document, script);
var result = document.GetElementById("result");
Console.WriteLine(result.TextContent); // 輸出: Hello from JavaScript!
}
3.7 處理表格數(shù)據(jù)
AngleSharp 可以很方便地處理 HTML 表格:
static async Task Main(string[] args)
{
var config = Configuration.Default;
var context = BrowsingContext.New(config);
var html = @"
<table id='dataTable'>
<tr><th>Name</th><th>Age</th></tr>
<tr><td>John</td><td>30</td></tr>
<tr><td>Jane</td><td>25</td></tr>
</table>";
var document = await context.OpenAsync(req => req.Content(html));
var table = document.GetElementById("dataTable") as IHtmlTableElement;
foreach (var row in table.Rows)
{
var cells = row.Cells;
if (cells.Length == 2)
{
Console.WriteLine($"Name: {cells[0].TextContent}, Age: {cells[1].TextContent}");
}
}
}
3.8 解析 XML
AngleSharp 不僅可以解析 HTML,還可以解析 XML:
static async Task Main(string[] args)
{
var xml = @"
<root>
<element attribute='value'>
<child>Content</child>
</element>
</root>"
;
var parser = new XmlParser();
var document = await parser.ParseDocumentAsync(xml);
var root = document.DocumentElement;
var element = root.FirstElementChild;
var attribute = element.GetAttribute("attribute");
var childContent = element.FirstElementChild.TextContent;
Console.WriteLine($"Attribute: {attribute}");
Console.WriteLine($"Child content: {childContent}");
}
4. 錯(cuò)誤處理和最佳實(shí)踐
4.1 使用 try-catch 塊
始終使用 try-catch 塊來處理可能出現(xiàn)的異常:
try
{
var document = await context.OpenAsync("https://example.com");
// 處理文檔...
}
catch (AngleSharp.Io.NetworkException ex)
{
Console.WriteLine($"Network error: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"An unexpected error occurred: {ex.Message}");
}
4.2 檢查元素是否存在
在訪問元素之前,始終檢查元素是否存在:
var element = document.QuerySelector(".myClass");
if (element != null)
{
Console.WriteLine(element.TextContent);
}
else
{
Console.WriteLine("Element not found");
}
4.3 使用 Linq 與 AngleSharp
AngleSharp 的查詢結(jié)果可以很好地與 Linq 結(jié)合使用:
var paragraphs = document.QuerySelectorAll("p")
.Where(p => p.ClassList.Contains("important"))
.Select(p => p.TextContent);
foreach (var text in paragraphs)
{
Console.WriteLine(text);
}
5. 結(jié)論
AngleSharp 是一個(gè)強(qiáng)大而靈活的庫,它為 C# 開發(fā)者提供了豐富的 HTML、CSS 和 XML 處理功能。從簡單的文檔解析到復(fù)雜的 DOM 操作,AngleSharp 都能勝任。
通過本文提供的示例,你應(yīng)該能夠處理大多數(shù)與 Web 文檔解析和操作相關(guān)的任務(wù)。AngleSharp 的 API 設(shè)計(jì)直觀,使得即使是復(fù)雜的操作也能夠簡單地實(shí)現(xiàn)。
在使用 AngleSharp 時(shí),請記住正確處理異常,并考慮性能影響。對于需要處理大量文檔或執(zhí)行頻繁操作的情況,可能需要考慮使用緩存或其他優(yōu)化技術(shù)。
該文章在 2024/10/30 14:56:48 編輯過