小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

別在迷戀正則表達(dá)式解析html了,好嗎?

 逗咳嗽 2016-02-18

  近段時(shí)間在論壇上面興起了一股正則之風(fēng),不論做什么都喜歡用正則

  你在后臺(tái)解析json格式字符串,必須要用正則,好吧,你可能不知道用 JavaScriptSerializer類(lèi),

  你解析類(lèi)似www.xxx.com?a=a1&b=b2&c=c3的querystring參數(shù),必須用正則,好吧,你也可能不知道string.split方法

  你解析html你還必須用正則,好吧,這就真沒(méi)有必要了,因?yàn)樵诮馕鰄tml用到正則的時(shí)候你很多時(shí)候就不得不用到平衡組,你很有可能卡在這里

  正則的強(qiáng)大性與通用性就不提了,一般的處理完全夠用了,你完全可以自己去“系統(tǒng)”的學(xué)習(xí)(注:系統(tǒng)學(xué)習(xí)正則),在配上RegexBuddy或者在線(xiàn)的正則(注:附注會(huì)提到內(nèi)容)的工具就可以掌握一些常用的用法

  但是去解析html,還是用專(zhuān)業(yè)的庫(kù)去解析吧,雖然條條大路通羅馬,你真沒(méi)必要以鐵人三項(xiàng)的精神去做用正則死嗑html。

  其實(shí)解析html的庫(kù)有滿(mǎn)多不錯(cuò)的,如 HtmlAgilityPack , 又或者 Jumony , 以及Java的解析庫(kù)htmlparser(有.net版的),下面列一個(gè)小例子:

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

  

    抓取評(píng)論區(qū)的:回復(fù)內(nèi)容,購(gòu)買(mǎi)人名字,購(gòu)買(mǎi)時(shí)間

    引用:HtmlAgilityPack庫(kù)

    

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./ws/eBayISAPI.dll?ViewFeedback2&ftab=AllFeedback&userid=paragad&iid=-1&de=off&items=25&interval=0&mPg=151")
                          //Skip(1)排除標(biāo)題行 where((x,index)=>index%2==0)選取相應(yīng)的內(nèi)容行
                          .DocumentNode.SelectSingleNode("http://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,
                              //注意,任何時(shí)候的SelectSingleNode方法都是以整個(gè)document為前提的,個(gè)人覺(jué)得應(yīng)該當(dāng)前的節(jié)點(diǎn)為前擔(dān)
                              Id =row.ChildNodes[2].SelectSingleNode(row.ChildNodes[2].XPath+"http://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();
        }


    }
}

整個(gè)結(jié)構(gòu)清晰自然,利用Xpath的來(lái)進(jìn)行選取相當(dāng)方便,輕易就可以抓取內(nèi)容。

附注: 

一,正則相關(guān)

1.30分鐘搞定正則(了然正則的基礎(chǔ)知識(shí)點(diǎn))

2.正則達(dá)人的博客

3.正則工具RegexBug

二,解析庫(kù):

  XPath簡(jiǎn)明介紹
 XPath 使用路徑表達(dá)式來(lái)選取 XML 文檔中的節(jié)點(diǎn)或節(jié)點(diǎn)集。節(jié)點(diǎn)是通過(guò)沿著路徑 (path) 或者步 (steps) 來(lái)選取的。
 下面列出了最有用的路徑表達(dá)式:
 nodename:選取此節(jié)點(diǎn)的所有子節(jié)點(diǎn)。 
 /:從根節(jié)點(diǎn)選取。 
 //:從匹配選擇的當(dāng)前節(jié)點(diǎn)選擇文檔中的節(jié)點(diǎn),而不考慮它們的位置。 
 .:選取當(dāng)前節(jié)點(diǎn)。 
 ..:選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)。
 例如有下面一段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使用詳解(續(xù)) </ 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開(kāi)發(fā)的一般步驟 </ 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高級(jí)應(yīng)用 </ title >  
  2.     < Url > http://zhoufoxcn.blog.51cto.com/792419/166415 </ Url >  
  3.     < CreateAt   type = "zh-cn" > 2007-09-08 </ price >  
  4.   </ Article >  
  5.   </ Articles >  

  針對(duì)上面的XML文件,我們列出了帶有謂語(yǔ)的一些路徑表達(dá)式,以及表達(dá)式的結(jié)果:
 /Articles/Article[1]:選取屬于Articles子元素的第一個(gè)Article元素。 
 /Articles/Article[last()]:選取屬于Articles子元素的最后一個(gè)Article元素。 
 /Articles/Article[last()-1]:選取屬于Articles子元素的倒數(shù)第二個(gè)Article元素。 
 /Articles/Article[position()<3]:選取最前面的兩個(gè)屬于 bookstore 元素的子元素的Article元素。 
 //title[@lang]:選取所有擁有名為lang的屬性的title元素。 
 //CreateAt[@type='zh-cn']:選取所有CreateAt元素,且這些元素?fù)碛兄禐閦h-cn的type屬性。 
 /Articles/Article[Order>2]:選取Articles元素的所有Article元素,且其中的Order元素的值須大于2。 
 /Articles/Article[Order<3]/Title:選取Articles元素中的Article元素的所有Title元素,且其中的Order元素的值須小于3。
 
  HtmlAgilityPack API簡(jiǎn)明介紹
 在HtmlAgilityPack中常用到的類(lèi)有HtmlDocument、HtmlNodeCollection、
HtmlNode和HtmlWeb等。
 其流程一般是先獲取HTML,這個(gè)可以通過(guò)HtmlDocument的Load()或LoadHtml()來(lái)加載靜態(tài)內(nèi)容,或者也可以HtmlWeb的Get()或Load()方法來(lái)加載網(wǎng)絡(luò)上的URL對(duì)應(yīng)的HTML。
 得到了HtmlDocument的實(shí)例之后,就可以用HtmlDocument的DocumentNode屬性,這是整個(gè)HTML文檔的根節(jié)點(diǎn),它本身也是一個(gè)HtmlNode,然后就可以利用HtmlNode的SelectNodes()方法返回多個(gè)HtmlNode的集合對(duì)象HtmlNodeCollection,也可以利用HtmlNode的SelectSingleNode()方法返回單個(gè)HtmlNode。

轉(zhuǎn)自=> 周公博客

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多