打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
别在迷恋正则表达式解析html了,好吗?

  近段时间在论坛上面兴起了一股正则之风,不论做什么都喜欢用正则

  你在后台解析json格式字符串,必须要用正则,好吧,你可能不知道用 JavaScriptSerializer类,

  你解析类似www.xxx.com?a=a1&b=b2&c=c3的querystring参数,必须用正则,好吧,你也可能不知道string.split方法

  你解析html你还必须用正则,好吧,这就真没有必要了,因为在解析html用到正则的时候你很多时候就不得不用到平衡组,你很有可能卡在这里

  正则的强大性与通用性就不提了,一般的处理完全够用了,你完全可以自己去“系统”的学习(注:系统学习正则),在配上RegexBuddy或者在线的正则(注:附注会提到内容)的工具就可以掌握一些常用的用法

  但是去解析html,还是用专业的库去解析吧,虽然条条大路通罗马,你真没必要以铁人三项的精神去做用正则死嗑html。

  其实解析html的库有满多不错的,如 HtmlAgilityPack 又或者 Jumony 以及Java的解析库htmlparser(有.net版的),下面列一个小例子:

   地址:http://feedback.ebay.com/ws/eBayISAPI.dll?ViewFeedback2&ftab=AllFeedback&userid=paragad&iid=-1&de=off&items=25&interval=0&mPg=151

  

    抓取评论区的:回复内容,购买人名字,购买时间

    引用:HtmlAgilityPack库

    

using System;using System.Collections.Generic;using System.Linq;using System.Text;using HtmlAgilityPack;namespace AnaHtml{    class Program    {        static void Main(string[] args)        {            HtmlWeb html = new HtmlWeb();            var content = from page in html.Load("http://feedback.ebay.com/ws/eBayISAPI.dll?ViewFeedback2&ftab=AllFeedback&userid=paragad&iid=-1&de=off&items=25&interval=0&mPg=151")                          //Skip(1)排除标题行 where((x,index)=>index%2==0)选取相应的内容行                          .DocumentNode.SelectSingleNode("//table[@class='FbOuterYukon']").Elements("tr").Skip(1).Where((x, index) => index % 2 == 0)                          let row = page                          where row != null                          select new                          {                              Content = row.ChildNodes[1].InnerText,                              //注意,任何时候的SelectSingleNode方法都是以整个document为前提的,个人觉得应该当前的节点为前担                              Id =row.ChildNodes[2].SelectSingleNode(row.ChildNodes[2].XPath+"//div[1]//a[1]//span[1]").InnerHtml,                              Retime = row.ChildNodes[3].InnerText                          };            foreach (var item in content)            {                Console.WriteLine("\r\n Content:{0} Id={1} Time={2} ", item.Content, item.Id,item.Retime);            }            Console.Read();        }    }}

整个结构清晰自然,利用Xpath的来进行选取相当方便,轻易就可以抓取内容。

附注: 

一,正则相关

1.30分钟搞定正则(了然正则的基础知识点)

2.正则达人的博客

3.正则工具RegexBug

二,解析库:

  XPath简明介绍
 XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
 下面列出了最有用的路径表达式:
 nodename:选取此节点的所有子节点。 
 /:从根节点选取。 
 //:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 
 .:选取当前节点。 
 ..:选取当前节点的父节点。
 例如有下面一段XML:
 

<? xml   version = "1.0"   encoding = "utf-8" ?>  

  < Articles >  

  < Article >  

    < Title > 在ASP.NET中使用Highcharts js图表 </ title >  

    < Url > http://zhoufoxcn.blog.51cto.com/792419/537324 </ Url >  

    < CreateAt   type = "en" > 2011-04-07 </ price >  

  </ Article >  

  < Article >  

    < Title   lang = "eng" > Log4Net使用详解(续) </ title >  

    < Url > http://blog.csdn.net/zhoufoxcn/archive/2010/11/23/6029021.aspx </ Url >  

    < CreateAt   type = "zh-cn" > 2010年11月23日 </ price >  

  </ Article >  

  < Article >  

    < Title > J2ME开发的一般步骤 </ title >  

    < Url > http://blog.csdn.net/zhoufoxcn/archive/2011/06/12/6540223.aspx </ Url >  

    < CreateAt   type = "zh-cn" > 2011年06月12日 </ price >  

  </ Article >  

  < Article >  

  1.     < Title   lang = "eng" > PowerDesign高级应用 </ title >  
  2.     < Url > http://zhoufoxcn.blog.51cto.com/792419/166415 </ Url >  
  3.     < CreateAt   type = "zh-cn" > 2007-09-08 </ price >  
  4.   </ Article >  
  5.   </ Articles >  

  针对上面的XML文件,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
 /Articles/Article[1]:选取属于Articles子元素的第一个Article元素。 
 /Articles/Article[last()]:选取属于Articles子元素的最后一个Article元素。 
 /Articles/Article[last()-1]:选取属于Articles子元素的倒数第二个Article元素。 
 /Articles/Article[position()<3]:选取最前面的两个属于 bookstore 元素的子元素的Article元素。 
 //title[@lang]:选取所有拥有名为lang的属性的title元素。 
 //CreateAt[@type='zh-cn']:选取所有CreateAt元素,且这些元素拥有值为zh-cn的type属性。 
 /Articles/Article[Order>2]:选取Articles元素的所有Article元素,且其中的Order元素的值须大于2。 
 /Articles/Article[Order<3]/Title:选取Articles元素中的Article元素的所有Title元素,且其中的Order元素的值须小于3。
 
  HtmlAgilityPack API简明介绍
 在HtmlAgilityPack中常用到的类有HtmlDocument、HtmlNodeCollection、
HtmlNode和HtmlWeb等。
 其流程一般是先获取HTML,这个可以通过HtmlDocument的Load()或LoadHtml()来加载静态内容,或者也可以HtmlWeb的Get()或Load()方法来加载网络上的URL对应的HTML。
 得到了HtmlDocument的实例之后,就可以用HtmlDocument的DocumentNode属性,这是整个HTML文档的根节点,它本身也是一个HtmlNode,然后就可以利用HtmlNode的SelectNodes()方法返回多个HtmlNode的集合对象HtmlNodeCollection,也可以利用HtmlNode的SelectSingleNode()方法返回单个HtmlNode。

转自=> 周公博客

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
HtmlAgilityPack 之 HtmlNode类
python中的爬虫神器 XPath 介绍
Python基础入门!XPath与lxml类库!你肯定没见过这么完美的资料
Python解析库lxml与xpath用法总结
小白学 Python 爬虫(20):Xpath 进阶
Python|快速掌握Python爬虫XPath语法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服