AngleSharp by Florian Rappl

<PackageReference Include="AngleSharp" Version="0.8.4.1" />

.NET API 1,229,312 bytes

 HtmlDocument

Represents a document node that contains only HTML nodes.
using AngleSharp.Dom.Events; using AngleSharp.Events; using AngleSharp.Extensions; using AngleSharp.Network; using AngleSharp.Parser.Html; using System; using System.Threading; using System.Threading.Tasks; namespace AngleSharp.Dom.Html { internal sealed class HtmlDocument : Document, IHtmlDocument, IDocument, INode, IEventTarget, IMarkupFormattable, IParentNode, IGlobalEventHandlers, IDocumentStyle, INonElementParentNode, IDisposable { public override IElement DocumentElement => this.FindChild<HtmlHtmlElement>(); public override string Title { get { IHtmlTitleElement htmlTitleElement = DocumentElement.FindDescendant<IHtmlTitleElement>(); if (htmlTitleElement != null) return htmlTitleElement.TextContent.CollapseAndStrip(); return string.Empty; } set { IHtmlTitleElement htmlTitleElement = DocumentElement.FindDescendant<IHtmlTitleElement>(); if (htmlTitleElement == null) { IHtmlHeadElement head = base.Head; if (head == null) return; htmlTitleElement = new HtmlTitleElement(this, null); head.AppendChild(htmlTitleElement); } htmlTitleElement.TextContent = value; } } internal HtmlDocument(IBrowsingContext context, TextSource source) : base(context, source) { base.ContentType = MimeTypes.Html; } internal HtmlDocument(IBrowsingContext context = null) : this(context, new TextSource(string.Empty)) { } public override INode Clone(bool deep = true) { HtmlDocument htmlDocument = new HtmlDocument(base.Context, new TextSource(base.Source.Text)); Node.CopyProperties(this, htmlDocument, deep); Document.CopyDocumentProperties(this, htmlDocument, deep); return htmlDocument; } internal static async Task<HtmlDocument> LoadAsync(IBrowsingContext context, IResponse response, TextSource source, CancellationToken cancelToken) { IConfiguration config = context.Configuration; IEventAggregator events = config.Events; HtmlDocument document = new HtmlDocument(context, source); HtmlParser parser = new HtmlParser(document); HtmlParseStartEvent startEvent = new HtmlParseStartEvent(parser); document.ContentType = response.Headers.GetOrDefault(HeaderNames.ContentType, MimeTypes.Html); document.Referrer = response.Headers.GetOrDefault(HeaderNames.Referer, string.Empty); document.DocumentUri = response.Address.Href; document.Cookie = response.Headers.GetOrDefault(HeaderNames.SetCookie, string.Empty); document.ReadyState = DocumentReadyState.Loading; events?.Publish(startEvent); startEvent.SetResult(await parser.ParseAsync(cancelToken).ConfigureAwait(false)); return document; } } }