<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      一、獲取數(shù)據(jù)

      想弄一個數(shù)據(jù)庫,由于需要一些人名,所以就去百度一下,然后發(fā)現(xiàn)了360圖書館中有很多人名



      然后就像去復制一下,發(fā)現(xiàn)復制不了,需要登陸





      此時f12查看源碼是可以復制的,不過就算可以復制想要插入數(shù)據(jù)也是很麻煩的。既然復制走不通,于是我抱著探索知識的精神,打開了Visual Studio


      首先我們需要先拿到整個頁面的數(shù)據(jù),此時的話可以使用WebClient對象來獲取數(shù)據(jù)(HttpWebRequest方式稍微有點麻煩),然后使用byte數(shù)組來接受一下返回值
      public static void GetData(String address) { WebClient wc = new WebClient();
      byte[] htmlData = wc.DownloadData(address); }
      此時需要將htmlData對象解碼為String對象,然后我們在網(wǎng)站中f12看一下解碼方式



      可以看到charset=utf-8,說明需要用utf-8來解碼,然后使用Encoding對象來解碼
      string html = Encoding.UTF8.GetString(htmlData);
      我們輸出一下html有沒有值
      static void Main(string[] args) { //將地址復制過來 GetData("
      http://www.360doc.com/content/18/1010/13/642066_793541226.shtml");
      Console.ReadKey(); }public static void GetData(String address) { WebClient wc =
      new WebClient(); //地址由調(diào)用時傳入 byte[] htmlData = wc.DownloadData(address); string
      html = Encoding.UTF8.GetString(htmlData); Console.WriteLine(html); }
      輸出:





      二、Regex匹配

      接下來就是匹配的問題了,首先看一下html文檔的結(jié)構(gòu)



      就是說只需要匹配到所有的p標簽,然后拿到其中的內(nèi)容就行了

      第一種想到的就是使用正則表達式匹配:
      public static void GetData(String address) { WebClient wc = new WebClient(); //
      地址由調(diào)用時傳入 byte[] htmlData = wc.DownloadData(address); string html =
      Encoding.UTF8.GetString(htmlData);//使用正則表達式匹配 <p或P>非空字符至少100個<P或p> Regex reg =
      new Regex("<[pP]>\\S{100,}</[Pp]>"); //接受所有匹配到的項 MatchCollection result =
      reg.Matches(html);//循環(huán)輸出 foreach (Match item in result) {
      Console.WriteLine(item.Value); } }
      調(diào)用不變,啟動:




      匹配到是匹配到了,但是我們把<p></p>標簽也匹配出來了,所以把正則表達式改進一下,使用組匹配,將p標簽中的內(nèi)容單獨匹配出來(當然也可以截取字符串)。也就是說在寫正則表達式時,將想要單獨匹配出來的數(shù)據(jù)用括號"(想要單獨匹配出來的數(shù)據(jù))"括起來,來看一下怎么寫:
      Regex reg = new Regex("<[pP]>(\\S{100,})</[Pp]>");
      然后如果想要拿數(shù)據(jù)的話,需要使用Match對象的Groups屬性通過索引來獲取匹配到的組:
      public static void GetData(String address) { WebClient wc = new WebClient(); //
      地址由調(diào)用時傳入 byte[] htmlData = wc.DownloadData(address); string html =
      Encoding.UTF8.GetString(htmlData);//使用正則表達式組匹配 <p或P>(非空字符至少100個)<P或p> Regex reg
      =new Regex("<[pP]>(\\S{100,})</[Pp]>"); //接受所有匹配到的項 MatchCollection result =
      reg.Matches(html);//循環(huán)輸出 foreach (Match item in result) { //0的話是整體匹配到的字符串對象 //
      1就是第一個匹配到的組(\\S{100,) Console.WriteLine(item.Groups[1]); } }
      輸出結(jié)果:



      這次p標簽就沒有被匹配進入組中(如果通過item.Groups[0]拿到的回是和上面匹配到一樣的數(shù)據(jù),會帶p標簽)

      匹配到了之后就可以使用item.Groups[1].Split('、')來將字符串分割為String數(shù)組,然后循環(huán)寫入數(shù)據(jù)庫,或者進行其他操作。

      三、HTML解析器NSoup


      雖然正則表達式也可以匹配,但是如果對正則表達式比較陌生的話,可能就不是友好了。如果有方法可以像用js操作html元素一樣,用C#操作html字符串,就非常棒了。NSoup就是可以做到解析html字符串,變成可操作的對象。

      首先使用前先在管理NuGet程序包中添加:NSoup,直接就可以搜索到,添加完成之后接下來就看一下如何使用

      使用NSoupClient.Parse(放入html代碼:<html>....</html>)創(chuàng)建一個聲明Docuemnt文檔對象:
      //聲明Document對象 Document doc = NSoupClient.Parse(html);
      第二種就是使用Document doc = NSoupClient.Connect(放入url)? ?
      .Get()/.Post(),然后他就會自動獲取url地址的html代碼,并且根據(jù)html代碼加載一個Document對象
      //通過url自動加載Document對象 Document doc = NSoupClient.Connect(address).Get();
      當然還有其他方式獲取,然后我們看一下如何使用Document對象
      //通過id獲取元素 //獲取id為form的元素 Element form = doc.GetElementById("form"); //
      通過標簽名獲取元素//獲取所有的p標簽 Elements p = doc.GetElementsByTag("p"); //通過類樣式獲取元素 //
      獲取類樣式為btn的元素 Elements c = doc.GetElementsByClass("btn"); //通過屬性獲取 //
      獲取包含style屬性的元素 Elements attr = doc.GetElementsByAttribute("style");
      也可以自己組合一些其他的嵌套操作,例如:



      獲取id為artContent下的所有p標簽
      //使用鏈式編程 //獲取id為artContent下的所有p標簽 Elements ps = doc.GetElementById("artContent"
      ).GetElementsByTag("p"); //等同于 //Element artContent =
      doc.GetElementById("artContent");//Elements ps =
      artContent.GetElementsByTag("p");
      元素方法的使用:
      //Elements是Element元素的集合 多了個s //Element對象的方法 Element id = doc.GetElementById("id
      "); //獲取或設置id元素的文本 id.Text(); //獲取或設置id元素的html代碼 id.Html(); //獲取或設置id元素的value值
      id.Val();
      都是像js操作html元素一樣的方法,而且方法的名字也很人性,基本上一看就會知道方法是什么意思,方法也太多了就不一一講了。

      然后我們來使用NSoup獲取所有的名字,來試一下就會發(fā)現(xiàn)很簡單了:

      ?方式一:
      public static void GetData(String address) { WebClient wc = new WebClient();
      byte[] htmlData = wc.DownloadData(address); string html =
      Encoding.UTF8.GetString(htmlData); Document doc= NSoupClient.Parse(html); //
      先獲取id為artContent的元素,再獲取所有的p標簽 Elements p = doc.GetElementById("artContent"
      ).GetElementsByTag("p"); foreach (Element item in p) {
      Console.WriteLine(item.Text()); } }
      方式二:
      public static void GetData(String address) { //直接通過url來獲取Document對象 Document
      doc = NSoupClient.Connect(address).Get(); //先獲取id為artContent的元素,再獲取所有的p標簽
      Elements p = doc.GetElementById("artContent").GetElementsByTag("p"); foreach
      (Element itemin p) { Console.WriteLine(item.Text()); } }
      運行結(jié)果都是一樣的




      總結(jié):效率的話不太了解就不做評價了,就簡單說一下優(yōu)缺點:使用正則表達式的話,需要對正則表達式有一定的熟悉,然后匹配數(shù)據(jù)的話也是很方便的,但是修改、添加、刪除的話就不是太方便了;使用HTMl解析器(HtmlAgilityPack、NSoup)的話操作起來明顯更方便一些,如果對js有一定的基礎,html解析器根本不需要大學習就可以熟練使用,然后對元素進行修改、添加、刪除、獲取都是非常方便的,不過如果對于未知的html結(jié)構(gòu)就不是太友好了,例如:如果獲取頁面上所有的http://www.baidu.com這類的地址的話,使用正則就會更好一些。

      ?

      ?

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          九九热在线 播放 | 男男涩涩gay网站软件 | 肏逼网欧美黄片免费观看 | chinesejapanese国产打屁股 | 九九久久国产 | 超碰啪啪 | 国产精品色欲AV久久水 | 91调教在线 | 中文无码在线播放 | chinese麻豆 |