C#使用HtmlAgilityPack解析Html 爬取图片和视频
HtmlAgilityPack简介
HtmlAgilityPack是.net下的一个HTML解析类库。支持用XPath来解析HTML。
问题来了,有人就会问为什么要使用能XPath呢? 小编答:因为对于在web端界面上的元素的xpath,在大部分游览器能够直接获取到,不用手动写。
✍对于HtmlAgilityPack总结:通过这个类库,先通过浏览器获取到xpath获取到节点内容然后再通过正则表达式匹配所需要的内容。
🤖使用HtmlAgilityPack库的操作流程
👀工具VS2022
NuGet包进行下载安装
👺HtmlAgilityPack库的一些类的说明
- HtmlAttribute--Html元素的属性
- HtmlAttributeCollection--一个元素属性的集合
- HtmlNode--HTML节点,包括注释,文本,元素等
- HtmlNodeCollection--一个HtmlNode节点集合
- HtmlNodeType--一个枚举 表示节点的类型,文档,注释,元素,文本
- HtmlTextNode--Html文本节点
- HtmlEntity--对应实体
- HtmlParseError--表示文档在解析过程中发现解析错误
- 👇下面示例适配部分没有反编译的---初步学习使用
private void Button_Click(object sender, RoutedEventArgs e) {
//这里因为网页上有些是动态获取数据,所以引入了一个第三个库,使用里面的一个WebView2控件获取网页数据
webView.Source = new Uri(txt.Text);
}
private void Button_Click_1(object sender, RoutedEventArgs e) {
GetMedia(".//img", @"下载路径");
}
private void Button_Click_2(object sender, RoutedEventArgs e) {
GetMedia(".//video", @"下载路径");
GetMedia(".//source", @"下载路径");
}
HtmlDocument doc=new HtmlDocument();
public async void GetMedia(string parameter, string dir) {
var str = "";
//解决网页乱码和不适配
object obj = await webView.CoreWebView2.ExecuteScriptAsync("document.documentElement.outerHTML");
str=Regex.Unescape(obj.ToString()).Replace("\"<html>", "<html>").Replace("</html>\"", "</html>");
doc.LoadHtml(str);
var elements = doc.DocumentNode.SelectNodes(parameter);
if (elements != null) {
foreach (var el in elements) {
if (el.Attributes.Contains("src")) {
var url = el.Attributes["src"].Value;
if (!string.IsNullOrEmpty(url) && url.StartsWith("http")) {
Uri uri = new Uri(url);
var fileName=uri.Segments.Last().ToLower();
DownLoad(url, $@"{dir}{fileName}");
}
}
}
}
}
public static bool DownLoad(string uri, string localFileName) {
try {
string ext = Path.GetExtension(localFileName);
if (string.IsNullOrEmpty(ext)) {
localFileName += ".png";
}
var server = new Uri(uri);
var p = Path.GetDirectoryName(localFileName);
if (!Directory.Exists(p)) Directory.CreateDirectory(p);
// 发起请求并异步等待结果
var httpClient = new HttpClient();
var responseMessage = httpClient.GetAsync(server).Result;
if (responseMessage.IsSuccessStatusCode) {
using (var fs = File.Create(localFileName)) {
// 获取结果,并转成 stream 保存到本地。
var streamFromService = responseMessage.Content.ReadAsStreamAsync().Result;
streamFromService.CopyTo(fs);
return true;
}
} else
return false;
} catch {
return false;
}