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