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

談如何解析Html並抓取資料

最近加入了一家新公司,他們是一家電商,業務是網上虛擬充值,我進去是做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()

再看一段

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
    }
}