您的位置:

用Anglesharp解析和操作HTML文档

一、Anglesharp简介

Anglesharp是一个纯C#的HTML解析器,提供一个友好的API,帮助用户在.NET平台中解析和操作HTML文档。与其他.NET平台的HTML解析器相比,Anglesharp的语法更加简单易懂,使用也更加方便,支持从根本上修改DOM。

如果你需要获取一个HTML文件中某个DOM元素的内容或者属性,或者需要在服务器端分析HTML文档并做进一步处理,Anglesharp将是一个不错的选择。

二、在项目中引用Anglesharp

在使用Anglesharp之前,需要将其添加到项目中。你可以通过NuGet下载Anglesharp包,也可以通过官方GitHub下载源代码并使用。这里我们使用NuGet进行安装。

Install-Package AngleSharp

三、从字符串解析HTML文档

在解析HTML文档之前,我们需要先创建一个Document对象,然后将HTML文件作为参数传入,则会返回DOM树的根节点HTMLHtmlElement。下面是一个解析HTML字符串并获取页面title的代码示例。

using AngleSharp;

// 解析HTML字符串,并获取title
var html = @"<!DOCTYPE html>
            <html>
                <head>
                    <title>Hello World</title>
                </head>
                <body>
                    <p>This is a sample paragraph.</p>
                </body>
            </html>";

var parser = new HtmlParser();
var doc = parser.ParseDocument(html);
var title = doc.Title;

在以上示例中,我们首先定义了一个HTML字符串,然后使用HtmlParser解析该字符串,并获取Document对象。最后通过doc.Title获取页面的title,其值为"Hello World"。

四、从文件解析HTML文档

除了从字符串解析HTML文档,我们还可以从文件中解析HTML文档。使用File.ReadAllText从文本文件中读取HTML代码,然后用HtmlParser进行解析。

using AngleSharp;
using System.IO;

// 从文件中解析HTML文档,并获取页面title
var filePath = @"D:\html\test.html";
var html = File.ReadAllText(filePath);

var parser = new HtmlParser();
var doc = parser.ParseDocument(html);
var title = doc.Title;

在以上示例中,我们通过File.ReadAllText从D:\html\test.html路径读取HTML代码,然后用HtmlParser进行解析,并获取页面title。

五、选择器操作

选择器是用于选择DOM树中特定元素的一种方法,可以帮助我们对HTML文档进行更加灵活的操作。在Anglesharp中,内置了CSS选择器,支持多种类型的选择器。

1. 获取所有p元素

using AngleSharp;
using AngleSharp.Dom;
using System.Linq;

// 获取HTML文档中所有的p元素
var html = @"<!DOCTYPE html>
            <html>
                <head>
                    <title>Hello World</title>
                </head>
                <body>
                    <p>This is a sample paragraph 1.</p>
                    <p>This is a sample paragraph 2.</p>
                    <p>This is a sample paragraph 3.</p>
                </body>
            </html>";

var parser = new HtmlParser();
var doc = parser.ParseDocument(html);
var pList = doc.QuerySelectorAll("p").ToArray();

在以上示例中,我们使用doc.QuerySelectorAll("p")获取页面中所有p元素,并通过ToArray()方法将其转换为数组。

2. 获取特定id元素

using AngleSharp;
using AngleSharp.Dom;
using System.Linq;

// 获取HTML文档中id为"test"的元素
var html = @"<!DOCTYPE html>
            <html>
                <head>
                    <title>Hello World</title>
                </head>
                <body>
                    <p id=""test"">This is a sample paragraph.</p>
                </body>
            </html>";

var parser = new HtmlParser();
var doc = parser.ParseDocument(html);
var element = doc.QuerySelector("#test");

在以上示例中,我们使用doc.QuerySelector("#test")查找页面中id为"test"的元素,并将其返回给element对象。

六、DOM操作

1. 创建元素

在Anglesharp中,可以使用CreateElement方法创建DOM元素。

using AngleSharp;
using AngleSharp.Dom;
using AngleSharp.Html.Dom;

// 创建一个新的p元素,并设置其内容和属性
var parser = new HtmlParser();
var doc = parser.ParseDocument("<html></html>");

var p = doc.CreateElement("p");
p.TextContent = "This is a new paragraph.";
p.ClassName = "my-class";

  

在以上示例中,我们使用doc.CreateElement<IHtmlParagraphElement>("p")创建了一个新的p元素,并定义了其内容和类别。

2. 修改元素

在Anglesharp中,我们可以很方便地修改DOM元素,例如修改HTML标签的属性。

using AngleSharp;
using AngleSharp.Dom;
using AngleSharp.Html.Dom;

// 创建一个包含img元素的文档,并修改其属性
var parser = new HtmlParser();
var doc = parser.ParseDocument(@"<html>
                                    <head>
                                        <title>Hello World</title>
                                    </head>
                                    <body>
                                        <img src=""test.jpg"" alt=""test image"" />
                                    </body>
                                </html>");
var img = doc.QuerySelector("img");
img.SetAttribute("src", "new-test.jpg");
img.SetAttribute("alt", "new test image");

在以上示例中,我们使用SetAttribute方法修改img元素的封装属性(src和alt)。

3. 删除元素

在Anglesharp中,我们也可以删除DOM元素。例如下面的示例演示了如何删除文档中所有的p元素。

using AngleSharp;
using AngleSharp.Dom;
using AngleSharp.Html.Dom;
using System.Linq;

// 删除所有p元素
var parser = new HtmlParser();
var doc = parser.ParseDocument(@"<html>
                                    <head>
                                        <title>Hello World</title>
                                    </head>
                                    <body>
                                        <p>This is a sample paragraph 1.</p>
                                        <p>This is a sample paragraph 2.</p>
                                        <p>This is a sample paragraph 3.</p>
                                    </body>
                                </html>");
var pList = doc.QuerySelectorAll("p").ToArray();
foreach (var p in pList)
{
    p.Remove();
}

在以上示例中,我们使用doc.QuerySelectorAll("p")获取页面中所有p元素,并通过循环遍历每一个p元素,并使用Remove()方法删除它们。

结语

本文介绍了如何使用Anglesharp解析和操作HTML文档,包括从字符串和文件中解析HTML、选择器操作以及DOM操作等。Anglesharp不仅提供了简单易懂的语法和方便快捷的API,还能够在.NET平台中提供高效且灵活的HTML解析支持。希望本文能够对读者理解和使用Anglesharp有所帮助。