可以在 C# 的 HtmlAgilityPack 中使用 LINQ 吗?

Posted

技术标签:

【中文标题】可以在 C# 的 HtmlAgilityPack 中使用 LINQ 吗?【英文标题】:It is possible to use LINQ in HtmlAgilityPack in C#? 【发布时间】:2020-08-26 01:08:09 【问题描述】:

我学习C# 并尝试编写一个简单的应用程序。想问你帮我优化下面的代码。 我写了 2 种方法,并考虑使用 yield 和 LINQ 让它变得更好。想想有没有可能?

    public List<string> getsSubpagesUrls(int subpages)
    
        List<string> subpagesUrls= new List<string>();
        for (int i = 1; i < subpages; i++)
        
            string singleUrl = $"url/search%&page=i";
            subpagesUrls.Add(singleUrl);
        
        return subpagesUrls;
    

    public List<string> getAllAnnouncementIds(int numberOfSubpages)
    
        List<string> annIds = new List<string>();
        foreach (var url in getsSubpagesUrls(numberOfSubpages))
        
            htmlWeb web = new HtmlWeb();
            var htmlDoc = web.Load(url);
            var htmlBody = htmlDoc.DocumentNode.SelectNodes("//xpath");
            var ids = htmlBody.Elements("element");
            foreach (var id in ids)
            
                annIds.Add(id.Attributes["data-item-id"].Value);
            
        
        return annIds;
    

【问题讨论】:

【参考方案1】:

要使用 yield 关键字,您将从您的函数返回一个 IEnumerable,我稍微重构了您的代码:

        public IEnumerable<string> getsSubpagesUrls(int subpages)
            => Enumerable.Range(1, subpages).Select(i => new string($"url/search%&page=i"));

        public IEnumerable<string> getAllAnnouncementIds(int numberOfSubpages)
        
            HtmlWeb web = new HtmlWeb();

            foreach (var url in getsSubpagesUrls(numberOfSubpages))
            
                var htmlDoc = web.Load(url);
                var htmlBody = htmlDoc.DocumentNode.SelectNodes("//xpath");
                var ids = htmlBody.Elements("element");
                foreach (var id in ids)
                
                    yield return id.Attributes["data-item-id"].Value;
                
            
        

【讨论】:

以上是关于可以在 C# 的 HtmlAgilityPack 中使用 LINQ 吗?的主要内容,如果未能解决你的问题,请参考以下文章

c# 爬虫 -ChromeDriver+HtmlAgilityPack爬取比赛实时比分

Android C# HtmlAgilityPack

HtmlAgilityPack 总结

如何使用 C# 在 Visual Studio 2010 中使用正则表达式或 HTMLAgilityPack 抓取 HTML 页面的特定部分?

C# HTML解析工具HtmlAgilityPack使用实例

C#基于.Net-HtmlAgilityPack库的爬虫初体验