
C#+HtmlAgilityPack—糗事百科桌面版V2.0
最近在浏览以前自己上传的源码,发现在糗事百科桌面端源码评论区中,有人说现在程序不能用了。查看了一下源码运行情况,发现是正则表达式解析问题。由于糗百的网页版链接和网页格式稍有变化,导致解释失败。虽然可以通过更改正则表达,重新获网页的信息,但比较复杂,出错率较高(技术有限)。因此第二个版本采用HtmlAgilityPack类库解析Html。
HtmlAgilityPack是一个解析Html文档的一个类库,当然也能够支持XML文件,该类库比.NET自带的XML解析库要方便灵活多,主要是HtmlAgilityPack支持XPath路径表达式,通过XPath表达式能够快速定位到文档中的某个节点。有了它,解析网页不成问题,接下来简述一下HtmlAgilityPack的使用方法。
HtmlAgilityPack 有3个比较重要的类型。 HtmlDocument : 加载Html文档(string),并解析成有层次的对象结构。 HtmlNode : 元素节点类型,该类型提供许多非常有用的方法,下面会将重点的方法都介绍一遍。 HtmlNodeCollection : html节点集合类型。
通过例子来讲解这三个类型的使用,可能会更加的清晰,html源码,如下:
使用HtmlDocument类型解析上面的html源码。
通过该类型的 LoadHtml 方法解析html字符串,然后获取html文档的根节点,当然该类型还有一个 Load方法,支持从文件中,url 或者流中加载html文档。获取了HtmlNode 类型的根节点之后,利用根节点与XPath路径表达可以获取文档中任意的节点。
获取所有class=pStyle的p节点
利用HtmlNode类型的SelectNodes(xpath)方法可以获取所有class为pStyle的p标签。但是这次会把文档中所有的样式类为pStyle的p标签都获取到。如果只想获取“div id="content"”容器下面的。只需要更改xpath路径表达式即可做到。
通过在之前的路径上加上div[@id='content']进行限定即可。如果只想找"div id="content"”容器下面的class=pStyle 且 title=HtmlAgility的p标签代码如下。
通过XPath可以很方便的定位到文档中的节点,并通过节点类型的属性或者方法来获取节点的属性值和文本值以及内部html。
获取节点的文本和class属性值,代码如下:
HtmlNode类型的属性和方法如下:
InnerText : 节点的文本值
InnerHtml: 节点内部的html字符串
GetAttributeValue :通过节点的属性名字获取属性值,该方法有三个重载的版本,可以获取分别返回bool,string、int 三种类型的属性值。
上面都在简介HtmlAgilityPack类库的使用,下面简单介绍一下XPath。 // 所有后代节点,从根部开始,跟SelectNodes方法前面的节点没关系 例子://div: 所有名为div的节点 . 表示当前节点,与SelectNodes方法前面的节点相关 例子:https://www.cnblogs.com/mingjiatang/p/div :当前节点下的所有名为div节点 .. 表示父节点,与SelectNodes方法前面的节点相关 例子: https://www.cnblogs.com/mingjiatang/div :当前节点的父节点下的div节点 @ 选取属性 例子://div/@id:所有包含id属性的div
XPath不仅仅可以通过路径定位,还可以对定位后的节点集做一些限制,使得选择更加精准。 /root/book[1] 节点集中的第一个节点 /root/book[last()] 节点集中最后一个节点 /root/book[position() - 2] 节点集中倒数第三个节点集 /root/book[position() < 5] 节点集中前五个节点集 /root/book[@id] 节点集中含有属性id的节点集 /root/book[@id='chinese'] 节点集中id属性值为chinese的节点集 /root/book[price > 35]/title 节点集中book的price元素值大于35的title节点集
XPath对于路径匹配,谓语限制都可以使用通配符。 /div/* div节点下面的所有节点类型 //div[@*] div下面的所有属性
此外XPath还能进行逻辑运算 | ——例:/root/book[1] | /root/book[3]:两个节点集的合并—— () //div[@id='test1' and @class='divStyle']—— 找寻所有 id=test1 和class=divStyle 的div节点 //div[not(@class)]——找寻不包括class属性div节点
最后在提供一个小技巧,在网页中打开开发者工具,可以直接定位到相应的html节点,然后右键可以直接获取该节点在文档中的XPath路径,如下图:
好了, HtmlAgilityPack类库的使用就介绍到这里。
关于糗百的网页结构分析,在这篇文章使用HttpGet协议与正则表达实现桌面版的糗事百科 已经详细介绍了,在此就不在赘述了,下面简介一下抓取糗百段子的关键代码。
下载图片的代码如下:
需要注意的是:
获取糗百头像的地址为://pic.qiushibaike.com/system/avtnew/3281/32814675/medium/2017070317185381.JPEG" ,一定要在前面加上"http:" 才能正确的下载头像。
效果如下:
通过HtmlAgilityPack来解析文档,很轻巧灵活,主要是不容易出错。觉得这个解析包和Python的Beautiful Soup 库有异曲同工之妙,都是解析网页的好工具。
本文的源码下载链接:https://github.com/StartAction/qbDesktop
最近更新科技资讯
- 22年过去了,《透明人》依然是尺度最大的科幻电影,没有之一
- 人类基因编辑技术及其伦理问题
- 不吹不黑,五阿哥版的《嫌疑人》能过及格线
- 论Lacan心理公众号的“双标”特质
- 猎罪图鉴:犯罪实录 女性伦理
- 清入关的第一位皇帝是谁,清朝入关后有几位皇帝?
- 描写露台的优美句子
- 谭德晶:论迎春悲剧的叙事艺术
- 中秋节的好词好句
- 《三夫》:一女侍三夫,尺度最大的华语片要来了
- 赛博朋克的未来,在这里
- 文件1091/721/2A:反概念武器实体的一封信件
- 尤战生:哥伦比亚大学点点滴滴
- 韩国最具独特魅力的男演员(安在旭主演的电视剧有哪些)
- 乃至造句
- 请保护好我们的医生,他们太难了
- GCLL06-土木工程的伦理问题-以湖南凤凰县沱江大桥大坍塌事故为例
- 黄金宝典:九年级道德与法治核心考点必背篇
- 【我心中的孔子】伟大的孔子 思想的泰山
- CAMKII-δ9拮抗剂及其用途
- 选粹 | 郑玉双:法教义学如何应对科技挑战?——以自动驾驶汽车为例
- 苍井空37岁宛若少女,携子送祝福遭热讽,下架所有视频母爱无私
- 日韩新加坡怎么对待影视剧中的裸露镜头
- 中西方文化中的颜色词
- 土豪家的美女摸乳师——关于电影《美人邦》