HTML解析器HtmlAgilityPack的一些使用总结(C#)

哎~本来这些总结是作为使用时的快速备注,但是用不上了.实际应用当中HtmlAgilityPack的可靠性不太稳定,一主要问题是:
-> 一些字符会出现乱码或者变成‘?‘,如韩语字符.由于我是已经有HTML源,只需要Load后解析,所以设置OverrideEncoding的方法不管用.
-> 有时候获取到的元素内容会多个换行或空格什么的,然后又要增加代码过滤,然后效率就下来了... ...
浪费了不少时间,到头来还是mshtml可靠性高些.而且调用方法也熟悉.
不管网上对各种HTML解析器怎么测评,只有自己试了才知道...

/*
    c# HtmlAgilityPack
    --------------------------------
 * 关于节点的重要属性:
    Attributes             获取节点的属性集合
    ChildNodes            获取子节点集合(包括文本节点)
    HasAttributes           判断该节点是否含有属性
    HasChildNodes           判断该节点是否含有子节点
    HasClosingAttributes        判断该节点的关闭标签是否含有属性(</xxx class="xxx">)
    Line               获取该节点的开始标签或开始代码位于整个HTML源代码的第几行(行号)
    Name                Html元素名
    Id                获取该节点的Id属性
    NextSibling            获取下一个兄弟节点
    PreviousSibling          获取前一个兄弟节点
    NodeType              获取该节点的节点类型(四个:Text,Element,Document,Comment)
    OwnerDocument            节点所在的HtmlDocument文档
    ParentNode            获取该节点的父节点
    XPath               根据节点返回该节点的XPath
 * 关于节点的重要方法:
    Elements(string name);       根据参数名获取匹配的元素集合
    Element(string name);       根据参数名获取一个元素
    DescendantNodes();         获取所有子代节点,如果有参数,注意元素名要与参数匹配
    DescendantNodesAndSelf();     获取所有的子代节点以及自身,如果有参数,注意元素名要与参数匹配
    --------------------------------
    Document.GetElementbyId("box").InnerText;

    //枚举元素两种写法
    string s = "";
    HtmlNodeCollection nodes = Document.DocumentNode.SelectNodes("//li");
    foreach (HtmlNode li in nodes)
    {
        s+=li.InnerText+" ";
    }
    --------------------------------
    foreach (HtmlNode li in Document.DocumentNode.Descendants("li"))
    {
        s+=li.InnerText+" ";
    }
    --------------------------------
    string s = node.Attributes["src"].Value;
    string s = node.Attributes["href"].Value;
    string s = node.Attributes["title"].Value;
    --------------------------------
    //获取所有板块的a标签
    HtmlAgilityPack.HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//a");
    --------------------------------
    //获取所有a标签的链接
    foreach (HtmlNode a in Document.DocumentNode.Descendants("a"))
    {
        s+=a.Attributes["href"].Value+" ";
    }
    或者
    foreach (HtmlNode a in Document.DocumentNode.SelectNodes("//a"))
    {
        s+=a.Attributes["href"].Value+" ";
    }
    --------------------------------
    //获取标题,SelectSingleNode用于获取满足条件的唯一的节点。
    Document.DocumentNode.SelectSingleNode("//title").InnerText;
    --------------------------------
    //获取name为selected的li,也就是相当于getElementsByName():
    HtmlNode node = Document.DocumentNode.SelectSingleNode("//li[@name=‘selected‘]");
    s=node.InnerText;
    或者
    Document.DocumentNode.SelectSingleNode("//li[@name=‘selected‘]").InnerText;
    --------------------------------
    每一个Htmlnode,你要获取他的数据用这个方法:  node.Attributes["src"].Value
    --------------------------------
    xpath包含7个类型:元素(Element),属性(Attribute),文本(Test),命名空间,处理指令,注释,文档根节点。
    下面列出了最有用的路径(也就是遇到的参数叫:XPath)表达式:
    nodename    选取此节点的所有子节点。
    /           从根节点选取。
    //          从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
    .           选取当前节点。
    ..          选取当前节点的父节点。
    @           选取属性。
 * 注意:
    “//”:从当前选择的节点开始寻找,对于后面的表达式是在当前节点中的任意位置寻找,只要符合的就加入到选择结果中。
    “./”:也是从当前选择的节点开始选择,但是仅仅是寻找当前节点的直系子元素,而对于孙子及以后的节点都不考虑。
    --------------------------------
    /div/li[1]:选取属于div子元素的第一个li元素。
    /div/li[last()]:选取属于div子元素的最后一个li元素。
    /div/li[last()-1]:选取属于div子元素的倒数第二个li元素。
    /div/li[position()<3]:选取最前面的两个属于 div 元素的子元素的li元素。
    //title[@lang]:选取所有拥有名为lang的属性的title元素。
    //div[@id=‘box‘]:选取所有div元素,且这些元素拥有值为box的id属性。
    /div/li[Order>2]:选取div元素的所有li元素,且其中的Order元素的值须大于2。
    /div/li[Order<3]/Title:选取div元素中的li元素的所有Title元素,且其中的Order元素的值须小于3。
    --------------------------------
 */
时间: 2024-11-19 21:05:44

HTML解析器HtmlAgilityPack的一些使用总结(C#)的相关文章

【C#】获取网页内容及HTML解析器HtmlAgilityPack的使用

最近经常需要下载一些东西,而这个下载地址又会经过层层跳转,每个页面上都有很多广告,烦不胜烦,所以做了一个一键获得最终下载地址的小工具.使用C#,来获取网页内容,然后通过HtmlAgilityPack获取某a标签的href,不断循环,层层跳转,最后获得最终下载地址. 下面,介绍HtmlAgilityPack的使用方法,这个方法也是从网上很多篇文章中拼凑摸索出来的,因为找了一大圈根本找不到HtmlAgilityPack的文档…… 首先,using HtmlAgilityPack; 代码片段: str

Atitit.html解析器的选型&amp;#160;jsoup&amp;#160;nsoup&amp;#160;,java&amp;#160;c#&amp;#160;.net&amp;#160;版本号

Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本号 1. 框架选型的要求 1 1.1. 文档多 1 1.2. 跨平台 1 2. html解析器特性: 1 2.1. jQuery 风格的 CSS 选择器 1 2.2. 操作 HTML 文档. 1 3. 浏览器解析html的原理以及防止乱码 2 4. 把meta标签放在head区域的最前面 4 5. HTML解析器 4 6. 參考 8 6.1.1. atitit. java?jsoup?html table

[Python]HTML/XML解析器Beautiful Soup

[简介] Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.即HTML/XMLX的解析器. 它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作.它可以大大节省你的编程时间. [安装] 下载地址:点击打开链接 Linux平台安装: 如果你用的是新版的Debain或ubuntu,那么可以通过系统的软件包管理来安装: $ apt-get install Python-bs4 B

lua标签解析器

lua 标签解析器 概述 一个类xml标签解析函数,将标签解析成Lua中的表结构它可以用来解析简单xml结构,可以作为RichLabel控件的字符串解析组件(其实它现在就是这么用的;-)) 原理 使用lua的模式匹配, 使用了模式串%b<>%b用来匹配对称的字符.常写为 %bxy,x和y是任意两个不同的字符. x作为匹配的开始,y作为匹配的结束.比如,%b<> 匹配以 < 开始,以 > 结束的字符串 要解析的字符串 hello world <div>hell

如何实现一个Java Class 解析器

原文出处: tinylcy 最近在写一个私人项目,名字叫做ClassAnalyzer,ClassAnalyzer的目的是能让我们对Java Class文件的设计与结构能够有一个深入的理解.主体框架与基本功能已经完成,还有一些细节功能日后再增加.实际上JDK已经提供了命令行工具javap来反编译Class文件,但本篇文章将阐明我实现解析器的思路. Class文件 作为类或者接口信息的载体,每个Class文件都完整的定义了一个类.为了使Java程序可以"编写一次,处处运行",Java虚拟机

springmvc 前段控制器 处理器映射器 处理器适配器 视图视图解析器 配置

1. 前段控制器 新建项目在web.xml中配置前段控制器 <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</pa

使用Scala基于词法单元的解析器定制EBNF范式文法解析

一.前言 近期在做Oracle迁移到Spark平台的项目上遇到了一些平台公式翻译为SparkSQL(on Hive)的需求,而Spark采用亲妈语言Scala进行开发.分析过大概需求过后,拟使用编译原理中的EBNF范式模式,进行基于词法的文法解析.于是拟采用传统的正则词法解析到EBNF文法解析的套路来实现,直到发现了StandardTokenParsers这个Scala基于词法单元的解析器类. 二.平台公式及翻译后的SparkSQL 平台公式的样子如下所示: 1 if(XX1_m001[D003

springmvc 解析器无法映射controller 配置的URL

搭建springmvc时,配置文件一切正常,项目运行成功,却无法响应http请求,查看log是因为没有对用url的controller,首先检查controller有没有被实例化,后来发现没有,因为没有引入spring-bean的相关包,好吧粗心....  But 引入后,还是同样的错误,找来找去毫无破绽啊,尼玛找度娘.....最后发现: <mvc:resources mapping="/images/**" location="/WEB-INF/images/&quo

Spring映射器、适配器、解析器

1 springmvc的映射器和适配器 1.1springmvc的映射器 根据客户端请求的url,找到处理本次请求的handler(处理器),将url和controller关联起来 1.2springmvc的适配器 对映射器查找到的controller中的方法进行调用. 第一种:Controller适配 第二种:HttpRequestHandler适配 第三种:注解适配 不同的处理器,对应不同的适配器,但是所有适配器最终都返回ModelAndView对象,springmvc通过对ModelAnd