一种快捷的解析HTML方案


======================================================
注:本文源代码点此下载
======================================================

由于网络太烂,我常常写一些爬虫程序解析一些视频网站的整个专辑或漫画网站的整卷漫画的地址,然后用下载工具离线下载后再统一看。但是,从html源文件中解析出标题和链接来是一件比较麻烦的事情。由于各个网站没有什么共通的特征,并且网站经常改版,导致解析算法基本上没有复用性,必须对每个网站写一个解析算法。

以前我一贯是通过正则表达式写来直接解析文本,本身这种方式并没有什么问题,也非常方便。但是写正则表达式还是比较麻烦,需要反复调试,并且通用性不强,也很容易失效。一旦写多了还是很费脑子的。由于最近越来越懒了,因此便想转寻一种更为简洁快速的解析html文件的方法。

最初尝试的一种方式是通过第三方的htmlparser来解析html为一棵树,然后根据一些attribute特征遍历这棵树来找到想要的节点。这种方式和上面的正则表达式的方式比起来要更合适一些,找特殊attribute找比编写正则表达式简单多了。找了几个htmlparser看了一下,一个通用的问题是查询接口不够友好,往往也需要反复在visualstudio下调试才能正确的解析出所要的结果。

在上面的这种方式碰壁了之后,我想到了另一种更为简单的实现方式:将html文件转换为xml文件,这样就可以通过xpath或xlinq查询出我们所想要的结果。由于.net framework内置的api强大而简洁,用起来要方便得多了。

但这样做有如下两个问题:

如何将html转换为xml

如何快速的从xml里查询到所想要的结果

对于第一个问题,网上有不少开源的工具可以使用,但大多存在一些多多少少的bug,由于我也没有找到很合适的解析器,这里就不说了。对于第二个问题,就像我们在编写sql语言的时候,往往并不是直接将sql语言写入代码,而是会先找个工具测试一下,但结果无误后再将其写入代码那样;我写一个xpath查询测试工具来生成所需要的xpath,这样也能发现html转xml工具中的bug。由于能力有限,弄了一个比较简陋的工具,不过还是非常方便的。

这里我就拿一个优酷的例子演示一下:

例如,我们要获取如下网页的专辑信息http://www.youku.com/playlist_show/id_4425617.html,只需要如下几步。

首先输入url即可得到解析完成后的xml文件

然后用ie中的开发者工具获取所想要信息处的html片段

根据html片段写出xpath后,就可以验证xpath的查询结果了。

同样,用它来获取博客园今日首页的文章也是一件很容易的事情。

在这种方式下,对于不同的网页,只需要构造不同的xpath即可;并且在浏览器提供的开发者工具的帮助下,写xpath比写正则表达式简单的多,验证也非常方便。但由于目前的html解析至xml的库不够完善,xpath测试工具也不够友好和强大,还有不少问题有待解决,这里就不放代码了。本文只是抛砖引玉,介绍了一种简单的思路和方法,各位朋友有什么更合适的方法欢迎留言交流。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值