1. 程式人生 > >談如何解析Html並抓取數據

談如何解析Html並抓取數據

rst invalid sss new 再看 ras 如虎添翼 navig sys

最近加入了一家新公司,他們是一家電商,業務是網上虛擬充值,我進去是做OA裏面的財務,
本來想到的是做一做信息管理的,沒想到還涉及到去別的網站采集數據(解析Html,
最終用采集到的數據生成財務憑證)這一環,這個是我從未接觸過的領域,
大致看了一下,目的也就是解析網頁的HTML從中找出需要的數據。
那麽問題來了,該怎樣找到這些信息?

由於實質就是在一堆文本裏面“挖出”你要的東西,比如網頁裏面的Title的文本,
很多人自然的會想到正則表達式,呵呵,這個不是不行,而是太費勁了。想想看,
HTML的實質是什麽?不就是一堆標簽嘛,再往深了想,它就是XML的子集,
XML是可以用XPath還可以用Linq To XML。起初我就想,看有沒有Linq To HTML的實現,
還真讓我找到一個。用天朝的Baidu搜到的,真不容易,
點這裏,
看看資料,真的很少,說明並不多,沒敢用。
在網上流傳最多的解析HTML的庫是一個叫Html Agility Pack的東西,
並用它還可以使用Nuget方便的引用到項目中去,真是太省心了!官網源碼

看了Html Agility Pack的簡單介紹,它是用XPath的語法去檢索HTML元素的,這樣已經算夠方便了吧?還不夠好!比如我要找一個Div,我只能通過索引找,如html/body/div[4],不爽吧?感覺還是不夠靈活,經過一番搜索,又找到了一個好東西ScrapySharp,看看它是如何檢索HTML元素的

ScrapingBrowser browser = new ScrapingBrowser();

//set UseDefaultCookiesParser as false if a website returns invalid cookies format
//browser.UseDefaultCookiesParser
= false; WebPage homePage = browser.NavigateToPage(new Uri("http://www.bing.com/")); PageWebForm form = homePage.FindFormById("sb_form"); form["q"] = "scrapysharp"; form.Method = HttpVerb.Get; WebPage resultsPage = form.Submit(); HtmlNode[] resultsLinks = resultsPage.Html.CssSelect("div.sb_tlst h3 a"
).ToArray(); WebPage blogPage = resultsPage.FindLinks(By.Text("romcyber blog | Just another WordPress site")).Single().Click()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

再看一段

using System.Linq;
using HtmlAgilityPack;
using ScrapySharp.Extensions;

class Example
{
    public void Main()
    {
        var divs = html.CssSelect(“div”);  //all div elements
        var nodes = html.CssSelect(“div.content”); //all div elements with css classcontent
        var nodes = html.CssSelect(“div.widget.monthlist”); //all div elements with the both css class
        var nodes = html.CssSelect(“#postPaging”); //all HTML elements with the id postPaging
        var nodes = html.CssSelect(“div#postPaging.testClass”); // all HTML elements with the id postPaging and css class testClass

        var nodes = html.CssSelect(“div.content > p.para”); //p elements who are direct children of div elements with css classcontent

        var nodes = html.CssSelect(“input[type=text].login”); // textbox with css class login
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

這不就是CSS選擇器嗎?乖乖,把Jquery那一套學著了,必須贊一個啊~!
我也找到一篇HTML Agility Pack 搭配 ScrapySharp,徹底解除Html解析的痛苦
兩個一配合著用,如虎添翼~!

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

談如何解析Html並抓取數據