User Tools

Site Tools

study:anglesharp:20250311-001:index

AngleSharp:AngleSharp:強大的C# HTML 解析庫 (2025-03-11)

Local Backup

  • AngleSharp 是一個功能強大的.NET 函式庫,用於解析HTML、XML 和CSS。它提供了一個直覺的API,使得在C# 中處理Web 文件變得簡單且有效率。本文將詳細介紹AngleSharp 的使用方法,並提供多個實用的範例。

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;
            // 创建一个新的上下文
            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. 進階用法

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);
        }
    
        // 通过标签名选择
        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 允許你動態修改文件:
  • 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;
    
        // 创建新元素
        var newDiv = document.CreateElement("div");
        newDiv.ClassName = "newClass";
        newDiv.TextContent = "This is a new div";
    
        // 添加到文档
        body.AppendChild(newDiv);
    
        // 修改现有元素
        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 支援複雜的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));
    
    // 选择第二个段落
    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 執行JavaScript

  • 雖然AngleSharp 主要用於HTML 和CSS 解析,但它也提供了一個基本的JavaScript 執行環境:
  • 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 處理表格數據

  • 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. 錯誤處理與最佳實踐

4.1 使用try-catch 區塊

  • 始終使用try-catch 區塊來處理可能出現的異常:
  • 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 的查詢結果可以與Linq 結合使用:
  • var paragraphs = document.QuerySelectorAll("p")
        .Where(p => p.ClassList.Contains("important"))
        .Select(p => p.TextContent);
    
    foreach (var text in paragraphs)
    {
        Console.WriteLine(text);
    }

5. 結論

  • AngleSharp 是一個強大且靈活的函式庫,它為C# 開發者提供了豐富的HTML、CSS 和XML 處理功能。從簡單的文件解析到複雜的DOM 操作,AngleSharp 都能勝任。
  • 透過本文提供的範例,你應該能夠處理大多數與Web 文件解析和操作相關的任務。 AngleSharp 的API 設計直觀,使得即使是複雜的操作也能夠簡單地實現。
  • 在使用AngleSharp 時,請記得正確處理異常,並考慮效能影響。對於需要處理大量文件或執行頻繁操作的情況,可能需要考慮使用快取或其他最佳化技術。

Permalink study/anglesharp/20250311-001/index.txt · Last modified: 2025/03/11 08:05 by jethro

oeffentlich