zoukankan      html  css  js  c++  java
  • 别在迷恋正则表达式解析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。

    转自=>周公博客

  • 相关阅读:
    606. Construct String from Binary Tree
    696. Count Binary Substrings
    POJ 3255 Roadblocks (次短路)
    POJ 2823 Sliding Window (单调队列)
    POJ 1704 Georgia and Bob (博弈)
    UVa 1663 Purifying Machine (二分匹配)
    UVa 10801 Lift Hopping (Dijkstra)
    POJ 3281 Dining (网络流之最大流)
    UVa 11100 The Trip, 2007 (题意+贪心)
    UVaLive 4254 Processor (二分+优先队列)
  • 原文地址:https://www.cnblogs.com/codefish/p/3085681.html
Copyright © 2011-2022 走看看