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。 -------------------------------- */
分享是追求进步的态度