隐藏

C#使用AngleSharp库解析html文档

发布:2022/12/27 10:21:09作者:管理员 来源:本站 浏览次数:305

一、简介


AngleSharp:https://github.com/AngleSharp/AngleSharp


AngleSharp是一个.NET库,使您能够解析基于尖括号的超文本,例如HTML,SVG和MathML,该库还支持未经验证的XML,AngleSharp的一个重要方面是CSS也可以解析。 

AngleSharp与类似的库(例如HtmlAgilityPack)相比的优势在于:


   公开的DOM使用的是W3C官方指定的API,即,甚至在AngleSharp中也可以使用querySelectorAll之类的东西。

   解析器还使用HTML 5.1规范,该规范定义了错误处理和元素校正。


AngleSharp库专注于标准合规性,交互性和可扩展性。因此,它为使用C#的Web开发人员提供了从在任何现代浏览器中使用DOM所获得的所有可能性。


image


官方实例:https://github.com/AngleSharp/AngleSharp.Samples 

这个简单的示例将使用Wikipedia的网站进行数据检索。



var config = Configuration.Default.WithDefaultLoader();

var address = "https://en.wikipedia.org/wiki/List_of_The_Big_Bang_Theory_episodes";

var context = BrowsingContext.New(config);

var document = await context.OpenAsync(address);

var cellSelector = "tr.vevent td:nth-child(3)";

var cells = document.QuerySelectorAll(cellSelector);

var titles = cells.Select(m => m.TextContent);

二、使用AngleSharp生成自动缩进格式化的html方法

1、操作DOM示例



//创建一个(可重用)解析器前端

var parser = new HtmlParser();

//html DOM节点

var source = "

<h1>Some example source</h1>

<p>This is a paragraph element</p>

";

 

//解析源文件

var document = parser.Parse(source);

//创建P标签

var p = document.CreateElement("p");

p.TextContent = "This is another paragraph.";

//添加到DOM

document.Body.AppendChild(p);

//返回完整html

var html = document.DocumentElement.OuterHtml;

ViewData["html"] = html;


效果展示


2、更改标签属性


给标签添加自定义属性



var parser = new HtmlParser();

 //为以下源代码生成HTML DOM

var document = parser.Parse("

<ul>

<li>First element</li>

<li>Second element</li>

<li>third</li>

<li class='bla'>Last</li>

</ul>

");

//获取所有li元素并将test属性设置为值测试

var elements = document.QuerySelectorAll("li").Attr("test", "test");

 //元素仍然包含所有li元素

ViewData["html"] = document.DocumentElement.OuterHtml;


效果展示


3、使用AngleSharp生成html代码自动缩进格式化



var parser = new HtmlParser();

var document = parser.ParseDocument(text);

using (var writer = new StringWriter())

{

    document.ToHtml(writer, new PrettyMarkupFormatter

                            {

                                Indentation = "\t",

                                NewLine = "\n"

                            });

    var indentedText = writer.ToString();

}

4、使用AngleSharp下载获取html代码



var requester = new DefaultHttpRequester("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");

requester.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");

requester.Headers.Add("Referer", "");

requester.Headers.Add("Accept-Language", "zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3");

var context = BrowsingContext.New(Configuration.Default.WithLocaleBasedEncoding().WithDefaultLoader().WithDefaultCookies().With(requester));

//根据虚拟请求/响应模式创建文档

var document = context.OpenAsync(url).Result;

using (var writer = new StringWriter())

{

    document.ToHtml(writer, new PrettyMarkupFormatter

                            {

                                Indentation = "\t",

                                NewLine = "\n"

                            });

    var indentedText = writer.ToString();

}

5、爬取豆瓣美女图片


新建一个Belle类用于保存获取的图片信息



///

/// 解析html

///

public class Belle

{

        ///

        /// 标题

        ///

        public string Title { get; set; }

        ///

        /// 图片地址

        ///

        public string ImageUrl { get; set; }

}


获取html并解析



// 设置配置以支持文档加载

var config = Configuration.Default.WithDefaultLoader();

// 豆瓣地址

var address = "https://www.dbmeinv.com/dbgroup/show.htm?cid=4";

// 请求豆辨网

var document =  BrowsingContext.New(config).OpenAsync(address);

// 根据class获取html元素

var cells = document.Result.QuerySelectorAll(".panel-body li");

// We are only interested in the text - select it with LINQ

List list = new List();

foreach (var item in cells)

{

     var belle = new Belle

     {

         Title= item.QuerySelector("img").GetAttribute("title"),

         ImageUrl= item.QuerySelector("img").GetAttribute("src")

     };

     list.Add(belle);

 }

ViewData["html"] = list;


到此这篇关于C#使用AngleSharp库解析html文档的文章就介绍到这了。