C#使用HtmlAgilityPack解析Html 爬取图片和视频
阅读原文时间:2023年08月09日阅读:6

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;
        }</code></pre></li>

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章