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