Foreword
爬虫虽方便…
请大家支持原版内容🙃🙃🙃🙃。
Html Agility Pack 工具简介
Html Agility Pack 作为一个HTML解析器。对与大多数解析器来说,它快速,并且有非常大的“容错性”(格式错误并不会影响解析。例:html的标签缺少情况并不影响解析……)
Html Agility Pack 基于 .NetCore。 理论上可以进行跨平台使用(具体未测试)。
Html Agility Pack 应用
加载Html
Html Agility Pack 支持从本地文件中加载,字符串加载和通过网页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);
...
获取节点。支持Xpath,并支持Linq
...
// With XPath
var value = doc.DocumentNode
.SelectNodes("//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();
...
节点内容的读取操作
...
html=@"
<root>
<h3 id="h3_name">
</h3>
hello world!
</root>
"
var doc = new HtmlDocument();
doc.LoadHtml(html);
//OuterHtml
var outerHtml = doc.DocumentNode.OuterHtml;
//outerHtml 结果为:<root>
// <h3 id="h3_name">
// </h3>
// hello world!
// </root>
// InnerHtml
var innerHtml = doc.DocumentNode.InnerHtml;
//innerHtml 结果为:<h3 id="h3_name">
// </h3>
// hello world!
// InnerText
var innerText = doc.DocumentNode.InnerText;
//innerText 结果为:hello world!
...
并且可以对节点的属性进行操作
...
var htmlNode = doc.DocumentNode.SelectSingleNode("//h3");
//获取节点属性的值
var nodeId = htmlNode.Attributes["id"].Value;
//nodeId的结果为: h3_name
//更改节点属性的值
htmlNode.SetAttributeValue("id", "alter_h3_name");
//此时 html的内容变为:<root>
// <h3 id="alter_h3_name">
// </h3>
// hello world!
// </root>
...
可以移除不需要的HTML内容
...
//移除节点有很多方法,这里只示例一个。
htmlNode.RemoveAll();
//移除了 <h3>节点
//此时 原 html 内容为:<root>
// hello world!
// </root>
...
处理扒取内容心得
处理完成后,就要显示需要的内容。
最近在做UWP应用,这里使用的 UWP的 Xaml 控件 WebView。
往html内容中添加 CSS,来自定义文章布局。
往html内容中添加 JavaScript 脚本,达到外部控制网页的目的。
...
//获取 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;";
}
//获取主要显示内容 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;";
}
//获取网页背景 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内容中
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内容中。
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()
{
//执行js脚本中的 setColor 脚本,传入参数。
await webView.InvokeScriptAsync("setColor", new[] { GetStep_outer_Style(), GetContent_main_outer_Style() });
}
/// <summary>
/// 去掉不需要的模块, 解决动态网页动态加载内容的消除
/// </summary>
/// <returns></returns>
public async Task Remove()
{
//执行js脚本中的 removeDialog 脚本,传入参数。
await webView.InvokeScriptAsync("removeDialog", null);
}
...