美文网首页
C#网站爬虫心得-工具Html Agility Pack

C#网站爬虫心得-工具Html Agility Pack

作者: Replay923 | 来源:发表于2018-08-01 17:10 被阅读0次

    Foreword

    爬虫虽方便...

    请大家支持原版内容🙃🙃🙃🙃。

    Html Agility Pack 工具简介

    Html Agility Pack 作为一个HTML解析器。对与大多数解析器来说,它快速,并且有非常大的“容错性”(格式错误并不会影响解析。例:html的标签缺少情况并不影响解析......)
    Html Agility Pack 基于 .NetCore。 理论上可以进行跨平台使用(具体未测试)。

    Html Agility Pack 应用

    加载Html

    Html Agility Pack 支持从本地文件中加载,字符串加载和通过网页URL链接加载

    ...
    
    // From File
    var doc = new HtmlDocument();
    doc.Load(filePath);
    
    // From String
    var doc = new HtmlDocument();
    doc.LoadHtml(html);
    
    // From Web
    var url = "http://html-agility-pack.net/";
    var web = new HtmlWeb();
    var doc = web.Load(url);
    
    ...
    

    获取节点。支持Xpath,并支持Linq

    ...
    
    // With XPath 
    var value = doc.DocumentNode
     .SelectNodes("//td/input")
     .First()
     .Attributes["value"].Value;
     
    // With LINQ 
    var nodes = doc.DocumentNode.Descendants("input")
     .Select(y => y.Descendants()
     .Where(x => x.Attributes["class"].Value == "box"))
     .ToList();
    
    ...
    

    节点内容的读取操作

    ...
    
    html=@"
            <root>
                <h3 id="h3_name">
                </h3>
                hello world!
            </root>
            "
    
    var doc = new HtmlDocument();
    doc.LoadHtml(html);
    
    //OuterHtml 
    var outerHtml = doc.DocumentNode.OuterHtml;
    //outerHtml 结果为:<root>
    //                      <h3 id="h3_name">
    //                      </h3>
    //                       hello world!
    //                 </root>
    
    // InnerHtml  
    var innerHtml = doc.DocumentNode.InnerHtml;
    //innerHtml 结果为:<h3 id="h3_name">
    //                  </h3>
    //                  hello world!
    
    // InnerText 
    var innerText = doc.DocumentNode.InnerText;
    //innerText 结果为:hello world!
    
    ...
    

    并且可以对节点的属性进行操作

    ...
    
    var htmlNode = doc.DocumentNode.SelectSingleNode("//h3");
    //获取节点属性的值
    var nodeId = htmlNode.Attributes["id"].Value;
    //nodeId的结果为: h3_name
    
    //更改节点属性的值
    htmlNode.SetAttributeValue("id", "alter_h3_name");
    //此时 html的内容变为:<root>
    //                      <h3 id="alter_h3_name">
    //                      </h3>
    //                      hello world!
    //                  </root>
    
    ...
    

    可以移除不需要的HTML内容

    ...
    //移除节点有很多方法,这里只示例一个。
    htmlNode.RemoveAll(); 
    //移除了 <h3>节点
    //此时 原 html 内容为:<root>
    //                      hello world!
    //                   </root>
    
    ...
    

    处理扒取内容心得

    处理完成后,就要显示需要的内容。
    最近在做UWP应用,这里使用的 UWP的 Xaml 控件 WebView。

    往html内容中添加 CSS,来自定义文章布局。
    往html内容中添加 JavaScript 脚本,达到外部控制网页的目的。

    ...
    
    //获取 h3 css 样式
    private string GetH3Style()
    {
            string fontColor = RootPage.Current.RequestedTheme != ElementTheme.Dark ?
            "color : #000000 !important;" : " color : #ffffff !important;";
    
            return fontColor + " padding:15px 15px 15px 15px !important;";
    }
    //获取主要显示内容 step_outer css 样式
    private string GetStep_outer_Style()
    {
        string fontColor = RootPage.Current.RequestedTheme != ElementTheme.Dark ?
            "color : #000000 !important;" : " color : #ffffff !important;";
    
        return fontColor + " padding:15px 15px 15px 15px !important;";
    }
    //获取网页背景 body css 样式
    private string GetContent_main_outer_Style()
    {
        string content_main_outer_color = RootPage.Current.RequestedTheme != ElementTheme.Dark ?
                        " background-color : #ffffff;" :
                        " background-color : #1e1e1e;";
    
        return content_main_outer_color;
    }
    //得到最终的 css 样式,用来添加到html内容中
    public string GetCSS()
    {
         string content_main_outer_Style = "body { " + GetContent_main_outer_Style() + " }";
    
        string h3_Style = "h3{" + GetH3Style() + "}";
    
        string step_outer_Style = ".step_outer {" + GetStep_outer_Style() + "}";
    
        return content_main_outer_Style + h3_Style + step_outer_Style;
    }
    //添加Js 脚本,用来加入到html内容中。
    public string GetJavaScript()
    {
        string script = @"function setColor(fontColorCss, backgroundColorCss) 
                            {                       
                                document.getElementsByClassName('step_outer')[0].style.cssText = fontColorCss;
                                var elements = document.getElementsByTagName('h3');
                                for (var i = 0;i < elements.length;i++)
                                {
                                     elements[i].style.cssText = fontColorCss;
                                }
                                document.getElementsByTagName('body')[0].style.cssText = backgroundColorCss;
                        }; 
                        function removeDialog()
                         {
                            document.getElementsByTagName('div')[0].innerHTML='';
                        };
                        ";
        return script;
    }
    
    /// <summary>
    /// 切换主题色
    /// </summary>
    /// <returns></returns>
    public async Task ChangeTheme()
    {
        //执行js脚本中的 setColor 脚本,传入参数。
        await webView.InvokeScriptAsync("setColor", new[] { GetStep_outer_Style(), GetContent_main_outer_Style() });
    }
    
    /// <summary>
    /// 去掉不需要的模块, 解决动态网页动态加载内容的消除
    /// </summary>
    /// <returns></returns>
    public async Task Remove()
    {
        //执行js脚本中的 removeDialog 脚本,传入参数。
        await webView.InvokeScriptAsync("removeDialog", null);
    }
    
    ...
    

    Talks

    Html Agility Pack

    法号阿兴-C# 网络爬虫利器之Html Agility Pack如何快速实现解析Html

    相关文章

      网友评论

          本文标题:C#网站爬虫心得-工具Html Agility Pack

          本文链接:https://www.haomeiwen.com/subject/xpprvftx.html