CSS dotnetcore 中的选择器?

CSS selector in dotnetcore?

我在 .NET 中使用 Fizzler.Systems.HtmlAgilityPack; 来获取使用 CSS 选择器的元素。现在我正在将我的项目移植到 .NET 核心,但似乎没有 Fizzler 虽然 HtmlAgilityPack.NetCore 可用。如何使用 CSS 选择器?

我使用了 HtmlAgilitypack,如下所示:

string url = "your URL";

                HtmlWeb web = new HtmlWeb();
                web.PreRequest = delegate (HttpWebRequest webRequest)
                {
                    webRequest.Timeout = 15000;
                    return true;
                };
                HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

List<HtmlNode> findclasses = doc.DocumentNode.Descendants("div").Where(d =>
        d.Attributes.Contains("class") && d.Attributes["class"].Value.Contains("YourClassName")
    ).ToList();

对于.NET中的CSS选择器,我一直使用ScrapySharp(虽然不支持伪元素)

ScrapySharp.Extensions 添加到您的 using 语句中,您只需在任何 HtmlNode 对象中调用 CssSelect,例如 DocumentNode.

using ScrapySharp.Extensions;
using HtmlAgilityPack;

namespace ConsoleLab
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            HtmlWeb web = new HtmlWeb();
            var document = web.Load("your url");
            //css class selector example
            var res1 = document.DocumentNode.CssSelect(".yourClass");
            //css id selector example
            var res2 = document.DocumentNode.CssSelect("#yourID");
        }
    }
}

另一种解决方案是使用 AngleSharp - 这是一个用于解析和 css-选择的一体化软件包(css 选择器是内置的)。我使用这些已经有一段时间了,但如果我没记错的话,angle sharp 提供了更好的 css 选择器支持。

Anglesharp 用法示例:

    //parsing a http-served url (asynchronous, used .Result here for simplification, but this defeats the asynchronoability of the code)
    IBrowsingContext bc = BrowsingContext.New();
    Task<IDocument> doc = bc.OpenAsync("yourAddress");
    //querying a single selector match
    IElement element1 = doc.Result.QuerySelector(".yourSelector");
    //querying multiple selector matches
    IEnumerable<IElement> elements1 = doc.Result.QuerySelectorAll(".yourSelectors");

    //parsing a physical html document, non-network dependent
    HtmlParser parser = new HtmlParser();
    IHtmlDocument doc2 = parser.Parse("htmlFile");
    IElement element2 = doc.Result.QuerySelector(".yourSelector");
    IEnumerable<IElement> elements2 = doc.Result.QuerySelectorAll(".yourSelectors");

只需将 HtmlAgilityPack.CssSelectors.NetCore NuGet 包引用添加到您的项目。

下面是如何使用 QuerySelectorAll() 方法的示例。

HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(url);

IList<HtmlNode> nodes = doc.QuerySelectorAll("div .my-class[data-attr=123] > ul li");
HtmlNode node = nodes[0].QuerySelector("p.with-this-class span[data-myattr]");

来源:github.com/trenoncourt