C#使用HtmlAgilityPack解析Html 爬取图片和视频

HtmlAgilityPack简介

HtmlAgilityPack是.net下的一个HTML解析类库。支持用XPath来解析HTML。

问题来了,有人就会问为什么要使用能XPath呢? 小编答:因为对于在web端界面上的元素的xpath,在大部分游览器能够直接获取到,不用手动写。

✍对于HtmlAgilityPack总结:通过这个类库,先通过浏览器获取到xpath获取到节点内容然后再通过正则表达式匹配所需要的内容。

🤖使用HtmlAgilityPack库的操作流程

     👀工具VS2022

NuGet包进行下载安装

👺HtmlAgilityPack库的一些类的说明

  • HtmlAttribute--Html元素的属性
  • HtmlAttributeCollection--一个元素属性的集合
  • HtmlNode--HTML节点,包括注释,文本,元素等
  • HtmlNodeCollection--一个HtmlNode节点集合
  • HtmlNodeType--一个枚举 表示节点的类型,文档,注释,元素,文本
  • HtmlTextNode--Html文本节点
  • HtmlEntity--对应实体
  • HtmlParseError--表示文档在解析过程中发现解析错误
  • 👇下面示例适配部分没有反编译的---初步学习使用
private void Button_Click(object sender, RoutedEventArgs e) {
    //这里因为网页上有些是动态获取数据,所以引入了一个第三个库,使用里面的一个WebView2控件获取网页数据
            webView.Source = new Uri(txt.Text);
        }

        private void Button_Click_1(object sender, RoutedEventArgs e) {
            GetMedia(".//img", @"下载路径");
        }

        private void Button_Click_2(object sender, RoutedEventArgs e) {
            GetMedia(".//video", @"下载路径");
            GetMedia(".//source", @"下载路径");
        }
        HtmlDocument doc=new HtmlDocument();
        public async void GetMedia(string parameter, string dir) {
            var str = "";
            //解决网页乱码和不适配
            object obj = await webView.CoreWebView2.ExecuteScriptAsync("document.documentElement.outerHTML");
            str=Regex.Unescape(obj.ToString()).Replace("\"<html>", "<html>").Replace("</html>\"", "</html>");
            doc.LoadHtml(str);
            var elements = doc.DocumentNode.SelectNodes(parameter);
            if (elements != null) {
                foreach (var el in elements) {
                    if (el.Attributes.Contains("src")) {
                        var url = el.Attributes["src"].Value;
                        if (!string.IsNullOrEmpty(url) && url.StartsWith("http")) { 
                            Uri uri = new Uri(url);
                            var fileName=uri.Segments.Last().ToLower();
                            DownLoad(url, $@"{dir}{fileName}");
                        }
                    }
                }
            }
        }

        public static bool DownLoad(string uri, string localFileName) {
            try {
                string ext = Path.GetExtension(localFileName);
                if (string.IsNullOrEmpty(ext)) {
                    localFileName += ".png";
                }
                var server = new Uri(uri);
                var p = Path.GetDirectoryName(localFileName);
                if (!Directory.Exists(p)) Directory.CreateDirectory(p);

                // 发起请求并异步等待结果
                var httpClient = new HttpClient();
                var responseMessage = httpClient.GetAsync(server).Result;
                if (responseMessage.IsSuccessStatusCode) {
                    using (var fs = File.Create(localFileName)) {
                        // 获取结果,并转成 stream 保存到本地。
                        var streamFromService = responseMessage.Content.ReadAsStreamAsync().Result;
                        streamFromService.CopyTo(fs);
                        return true;
                    }
                } else
                    return false;
            } catch {
                return false;
            }

 

posted @ 2022-03-11 11:17  庆喜  阅读(804)  评论(0编辑  收藏  举报