尘叶心繁

HtmlAgilityPack 网页数据处理

电脑版发表于:2019/1/19 1:38

HtmlAgilityPack  网络数据处理


新年新气象!祝大家新的一年里蓬勃发展,飞黄腾达,幸福健康!

今天讲的是一款处理网络数据的框架HtmlAgilityPack ,

相信许多同行都因为处理网页数据写正则表达式而搞得焦头烂额如果你使用这款框架会让你如鱼得水,释放你沉淀已久的复杂心情!


简介:


这是一个敏捷的HTML解析器,它构建了一个读/写DOM,并支持普通的xpath或xslt(您实际上不需要理解xpath或xslt就可以使用它,不用担心…)。

它是一个.NET代码库,允许您解析“离开Web”的HTML文件。

解析器对“真实世界”格式错误的HTML非常宽容。对象模型与System.xml的建议非常相似,但对于HTML文档(或流)。

原理:把抓取下来的网页转为Dom文档模型(xml),然后进行元素查找


动手小案例:


(1)首先创建一个 控制台 项目 learningHtmlAgilityPack

(2)选中引用右键-->点击 管理NuGet程序包-->点击浏览-->搜索HtmlAgilityPack

由此我们看到我们这里的最新稳定版为 v1.8.13 然后点击 安装 就可以了

(3)安装完成之后,我们将以百度为案例,从中获取一下 百度搜索 按钮的值


    1,打开开发者工具获取百度搜索按钮的XPath路径 ,确认无误后进行下一步操作 (注意:Chome浏览器可以识别类,id等元素属性;火狐将会从/head开始找起走)

   

 2,通过简洁的代码达成目的

using System.Net;

namespace learningHtmlAgilityPack
{
    class Program
    {
        static void Main(string[] args)
        {
            //实例化常规请求方式
            WebClient wc = new WebClient();
            //获取网页数据
            var vb = wc.DownloadData("https://www.baidu.com/");
            //转码
            var str = System.Text.Encoding.UTF8.GetString(vb);
            //实例化 HtmlAgilityPack 对象模型 
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            //加载文档对象模型
            doc.LoadHtml(str);
            //获取到百度按钮节点  把我们刚刚复制的XPath粘贴上去
            HtmlAgilityPack.HtmlNode htmlnode = doc.DocumentNode.SelectSingleNode("//*[@id='su']");

            //获取值 1,元素名称 2,当没有该元素时返回的内容
            string value = htmlnode.GetAttributeValue("value", "");

            System.Console.WriteLine(value);
            System.Console.ReadKey();
            
        }
    }
}


运行结果:

疑难杂症:


(1),实现获取多个标签的集合(通过遍历获取到其中的每一个元素)

HtmlAgilityPack.HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//*[@id='addToCart']//div");
                        foreach (var item in collection)
                        {
                            if (!string.IsNullOrEmpty(item.GetAttributeValue("name", "")))
                            {
                               //想怎么干就怎么搞xxxxx
                            }
                        }

(2),如果在item下面还有更多的便签或一个标签时照样这样写,只不过在获取第二层的时候XPath不需要//

HtmlAgilityPack.HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//*[@id='addToCart']//div");
foreach (var item in collection)
                        {
                            if (!string.IsNullOrEmpty(item.GetAttributeValue("name", "")))
                            {
                                 //HtmlAgilityPack.HtmlNode htmlnode = item.SelectSingleNode("//*[@id='su']");
                                 HtmlAgilityPack.HtmlNodeCollection childs = item.SelectSingleNode("ul/li");
                                 foreach(var singeitem in childs)
                                 {
                                     //xxxx
                                 }
                            }
                        }


关于TNBLOG
TNBLOG,技术分享。技术交流:群号677373950
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢