C#網(wǎng)站爬蟲心得-工具Html Agility Pack

Foreword

爬蟲雖方便...

請大家支持原版內(nèi)容????????澜汤。

Html Agility Pack 工具簡介

Html Agility Pack 作為一個HTML解析器购笆。對與大多數(shù)解析器來說,它快速饲趋,并且有非常大的“容錯性”(格式錯誤并不會影響解析。例:html的標簽缺少情況并不影響解析......)
Html Agility Pack 基于 .NetCore。 理論上可以進行跨平臺使用(具體未測試)夫否。

Html Agility Pack 應(yīng)用

加載Html

Html Agility Pack 支持從本地文件中加載,字符串加載和通過網(wǎng)頁URL鏈接加載

...

// From File
var doc = new HtmlDocument();
doc.Load(filePath);

// From String
var doc = new HtmlDocument();
doc.LoadHtml(html);

// From Web
var url = "http://html-agility-pack.net/";
var web = new HtmlWeb();
var doc = web.Load(url);

...

獲取節(jié)點叫胁。支持Xpath,并支持Linq

...

// With XPath 
var value = doc.DocumentNode
 .SelectNodes("http://td/input")
 .First()
 .Attributes["value"].Value;
 
// With LINQ 
var nodes = doc.DocumentNode.Descendants("input")
 .Select(y => y.Descendants()
 .Where(x => x.Attributes["class"].Value == "box"))
 .ToList();

...

節(jié)點內(nèi)容的讀取操作

...

html=@"
        <root>
            <h3 id="h3_name">
            </h3>
            hello world!
        </root>
        "

var doc = new HtmlDocument();
doc.LoadHtml(html);

//OuterHtml 
var outerHtml = doc.DocumentNode.OuterHtml;
//outerHtml 結(jié)果為:<root>
//                      <h3 id="h3_name">
//                      </h3>
//                       hello world!
//                 </root>

// InnerHtml  
var innerHtml = doc.DocumentNode.InnerHtml;
//innerHtml 結(jié)果為:<h3 id="h3_name">
//                  </h3>
//                  hello world!

// InnerText 
var innerText = doc.DocumentNode.InnerText;
//innerText 結(jié)果為:hello world!

...

并且可以對節(jié)點的屬性進行操作

...

var htmlNode = doc.DocumentNode.SelectSingleNode("http://h3");
//獲取節(jié)點屬性的值
var nodeId = htmlNode.Attributes["id"].Value;
//nodeId的結(jié)果為: h3_name

//更改節(jié)點屬性的值
htmlNode.SetAttributeValue("id", "alter_h3_name");
//此時 html的內(nèi)容變?yōu)椋?lt;root>
//                      <h3 id="alter_h3_name">
//                      </h3>
//                      hello world!
//                  </root>

...

可以移除不需要的HTML內(nèi)容

...
//移除節(jié)點有很多方法凰慈,這里只示例一個。
htmlNode.RemoveAll(); 
//移除了 <h3>節(jié)點
//此時 原 html 內(nèi)容為:<root>
//                      hello world!
//                   </root>

...

處理扒取內(nèi)容心得

處理完成后驼鹅,就要顯示需要的內(nèi)容微谓。
最近在做UWP應(yīng)用,這里使用的 UWP的 Xaml 控件 WebView输钩。

往html內(nèi)容中添加 CSS豺型,來自定義文章布局。
往html內(nèi)容中添加 JavaScript 腳本买乃,達到外部控制網(wǎng)頁的目的姻氨。

...

//獲取 h3 css 樣式
private string GetH3Style()
{
        string fontColor = RootPage.Current.RequestedTheme != ElementTheme.Dark ?
        "color : #000000 !important;" : " color : #ffffff !important;";

        return fontColor + " padding:15px 15px 15px 15px !important;";
}
//獲取主要顯示內(nèi)容 step_outer css 樣式
private string GetStep_outer_Style()
{
    string fontColor = RootPage.Current.RequestedTheme != ElementTheme.Dark ?
        "color : #000000 !important;" : " color : #ffffff !important;";

    return fontColor + " padding:15px 15px 15px 15px !important;";
}
//獲取網(wǎng)頁背景 body css 樣式
private string GetContent_main_outer_Style()
{
    string content_main_outer_color = RootPage.Current.RequestedTheme != ElementTheme.Dark ?
                    " background-color : #ffffff;" :
                    " background-color : #1e1e1e;";

    return content_main_outer_color;
}
//得到最終的 css 樣式,用來添加到html內(nèi)容中
public string GetCSS()
{
     string content_main_outer_Style = "body { " + GetContent_main_outer_Style() + " }";

    string h3_Style = "h3{" + GetH3Style() + "}";

    string step_outer_Style = ".step_outer {" + GetStep_outer_Style() + "}";

    return content_main_outer_Style + h3_Style + step_outer_Style;
}
//添加Js 腳本剪验,用來加入到html內(nèi)容中肴焊。
public string GetJavaScript()
{
    string script = @"function setColor(fontColorCss, backgroundColorCss) 
                        {                       
                            document.getElementsByClassName('step_outer')[0].style.cssText = fontColorCss;
                            var elements = document.getElementsByTagName('h3');
                            for (var i = 0;i < elements.length;i++)
                            {
                                 elements[i].style.cssText = fontColorCss;
                            }
                            document.getElementsByTagName('body')[0].style.cssText = backgroundColorCss;
                    }; 
                    function removeDialog()
                     {
                        document.getElementsByTagName('div')[0].innerHTML='';
                    };
                    ";
    return script;
}

/// <summary>
/// 切換主題色
/// </summary>
/// <returns></returns>
public async Task ChangeTheme()
{
    //執(zhí)行js腳本中的 setColor 腳本,傳入?yún)?shù)功戚。
    await webView.InvokeScriptAsync("setColor", new[] { GetStep_outer_Style(), GetContent_main_outer_Style() });
}

/// <summary>
/// 去掉不需要的模塊, 解決動態(tài)網(wǎng)頁動態(tài)加載內(nèi)容的消除
/// </summary>
/// <returns></returns>
public async Task Remove()
{
    //執(zhí)行js腳本中的 removeDialog 腳本娶眷,傳入?yún)?shù)。
    await webView.InvokeScriptAsync("removeDialog", null);
}

...

Talks

Html Agility Pack

法號阿興-C# 網(wǎng)絡(luò)爬蟲利器之Html Agility Pack如何快速實現(xiàn)解析Html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啸臀,一起剝皮案震驚了整個濱河市届宠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖席揽,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顽馋,死亡現(xiàn)場離奇詭異,居然都是意外死亡幌羞,警方通過查閱死者的電腦和手機寸谜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來属桦,“玉大人熊痴,你說我怎么就攤上這事∧舯觯” “怎么了果善?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長系谐。 經(jīng)常有香客問我巾陕,道長,這世上最難降的妖魔是什么纪他? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任鄙煤,我火速辦了婚禮,結(jié)果婚禮上茶袒,老公的妹妹穿的比我還像新娘梯刚。我一直安慰自己,他們只是感情好薪寓,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布亡资。 她就那樣靜靜地躺著,像睡著了一般向叉。 火紅的嫁衣襯著肌膚如雪锥腻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天植康,我揣著相機與錄音旷太,去河邊找鬼。 笑死销睁,一個胖子當著我的面吹牛供璧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冻记,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼睡毒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冗栗?” 一聲冷哼從身側(cè)響起演顾,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤供搀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后钠至,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葛虐,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年棉钧,在試婚紗的時候發(fā)現(xiàn)自己被綠了屿脐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡宪卿,死狀恐怖的诵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情佑钾,我是刑警寧澤西疤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站休溶,受9級特大地震影響代赁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邮偎,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一管跺、第九天 我趴在偏房一處隱蔽的房頂上張望义黎。 院中可真熱鬧禾进,春花似錦、人聲如沸廉涕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狐蜕。三九已至宠纯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間层释,已是汗流浹背婆瓜。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贡羔,地道東北人廉白。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像乖寒,于是被迫代替她去往敵國和親猴蹂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容