国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

以對象的方式訪問html中的標(biāo)簽,比正則表達(dá)式更好用的方式獲取html中的內(nèi)容,linq方式直接獲取所有的鏈接,更加先進(jìn)的c#版本爬蟲開源庫

這篇具有很好參考價值的文章主要介紹了以對象的方式訪問html中的標(biāo)簽,比正則表達(dá)式更好用的方式獲取html中的內(nèi)容,linq方式直接獲取所有的鏈接,更加先進(jìn)的c#版本爬蟲開源庫。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

這是我本人自己寫的一個開源庫,現(xiàn)已經(jīng)發(fā)布到nuget,可以直接在vs的nuget包管理中搜索到,或者可以到nuget官網(wǎng)下載:https://www.nuget.org/packages/ZmjConvert/,也可以到我的個人網(wǎng)站上下載源碼:https://www.zhaimaojun.cn/P/C%23%e6%a0%87%e7%ad%be%e7%b1%bb%e6%96%87%e6%9c%ac%e5%ba%8f%e5%88%97%e5%8c%96%e5%ba%93/

本包是.NET standard標(biāo)準(zhǔn)庫包,可以在.NET core,.NET,.NET framework等多種項目中直接使用,我本人也是在多種環(huán)境中使用這個包,沒有任何問題的,我本人主要用來提取網(wǎng)頁上的鏈接,圖片,可顯示文本等內(nèi)容。

先安裝這個包,然后就可以使用了,下面給出了一些使用方式的模板:

第一步 序列化html

/**這是html源碼的序列化*/
1
var dts = GetSource();//獲取html源碼,可以現(xiàn)下或者讀取html文件,dts需要是string類型的html內(nèi)容 2 if (!HtmlElement.TryParse(dts, out var eles, out var err)) 3 { 4 OnDownloadErrorHappend($"無法序列化url:{surl}");//反序列化失敗 5 return; 6 } 7 var srcurl = new Uri(surl);//這是html的源地址的當(dāng)前文檔的url,用于將當(dāng)前所有節(jié)點中相對路徑解析為絕對路徑時使用 8 eles = HtmlElement.GetAllElement(eles);//列出所有的子元素,就是將所有的節(jié)點提取為一個list,方便使用linq,或者使用foreach循環(huán)來遍歷,當(dāng)然原來的標(biāo)簽結(jié)構(gòu)是不會改變的。
 1 /**這是部分html標(biāo)簽源碼的反序列化,比如富文本編輯器的內(nèi)容*/
 2 try
 3 {
 4     var labstr = Gethtmlstr();//獲取部分標(biāo)簽的html源碼,比如富文本編輯器
 5     var eles = CHtmlElement<HtmlElement>.Parse(htmlstr);//反序列化標(biāo)簽組
 6     return eles;//反序列化成功后返回結(jié)構(gòu)對象
 7 }
 8 catch (Exception e)
 9 {
10     throw e;//反序列化失敗
11 }

第二步 獲取html文檔的標(biāo)題

1 var title = HtmlElement.GetWebTitle(eles);
1 /**獲取文檔的keywords*/
2 eles.FirstOrDefault(x => x.TagName == "meta" && x.Attributes.ContainsKey("name") && x.Attributes["name"].ToLower() == "keywords").Attributes.TryGetValue("content", out var keywords);
3 /**獲取文檔的description*/
4 eles.FirstOrDefault(x => x.TagName == "meta" && x.Attributes.ContainsKey("name") && x.Attributes["name"].ToLower() == "description").Attributes.TryGetValue("content", out var description);

第三步 提取所有的img標(biāo)簽的src,也就是獲取所有頁面上的圖片

1 /**這是獲取所有img標(biāo)簽的src屬性內(nèi)容*/
2 var imgs = new List<string>();
3 foreach (var e in eles.Where(x => x.TagName == "img" && x.Attributes.ContainsKey("src") && !string.IsNullOrWhiteSpace(x.Attributes["src"])))
4 {//封面圖片或者其他圖片
5     var furl = HttpUtility.HtmlDecode(e.Attributes["src"]);
6     var furi = new Uri(srcurl, furl);
7     imgs.Add(furi.AbsoluteUri);
8 }
/**這是提取所有img標(biāo)簽的data-src屬性,因為有些網(wǎng)站為了降低流量成本,img標(biāo)簽的src屬性中使用的是縮略圖,而data-src中使用的才是原圖*/
1
var imgs = new List<string>(); 2 foreach (var e in eles.Where(x => x.TagName == "img" && x.Attributes.ContainsKey("data-src") && !string.IsNullOrWhiteSpace(x.Attributes["data-src"]))) 3 {//封面圖片或者其他圖片 4 var furl = HttpUtility.HtmlDecode(e.Attributes["data-src"]); 5 var furi = new Uri(srcurl, furl); 6 imgs.Add(furi.AbsoluteUri); 7 }

第四步 提取所有的a標(biāo)簽的href,也就是獲取所有頁面上的鏈接

1 /**獲取所有的鏈接及鏈接的文本內(nèi)容*/
2 var links = new Dictionary<string, string>();
3 foreach (var e in eles.Where(x => x.TagName == "a" && x.Attributes.ContainsKey("href") && !string.IsNullOrWhiteSpace(x.Attributes["href"])))
4 {
5     links.Add(WebUtility.HtmlDecode(e.InnerText), WebUtility.HtmlDecode(e.Attributes["href"]));
6 }

第五步 提取所有可視文本,并保持換行,并且保持鏈接的有效

 1 /**提取所有的可視文本*/
 2 var tsts = new List<string>();//這是按行存儲的提取到的所有可視內(nèi)容
 3 var sb = new StringBuilder();//這是中間使用的拼接對象
 4 foreach (var item in eles)//eles為整個html反序列化后的列表,如果需要對指定的一個div或者p的可視內(nèi)容提取,可以先找到這個標(biāo)簽對象,然后在通過HtmlElement.GetAllElement(e.Children)可提取他的所有子標(biāo)簽,就可以提取所有可視內(nèi)容了
 5 {
 6     var tgs = new[] { "br", "div", "li", };//這是強(qiáng)迫換行的標(biāo)簽列舉,可根據(jù)需求添加或減少
 7     if (tgs.Contains(item.TagName))
 8     {
 9         sb.Append(HttpUtility.HtmlDecode(item.InnerText));
10         var innt = sb.ToString();
11         tsts.Add(innt);
12         sb.Clear();
13     }
14     else if (item.TagName == "a" && item.Attributes.ContainsKey("href") && !item.Attributes["href"].Contains("f95")) sb.Append($"<a href=\"{WebUtility.HtmlDecode(item.Attributes["href"])}\">{WebUtility.HtmlDecode(item.InnerText)}</a>");
15     else if (!item.InnerText.Contains('<')) sb.Append(HttpUtility.HtmlDecode(item.InnerText));
16 }

第六步 找到特定的標(biāo)簽

1 /**查找包含main-content樣式類的div*/
2 var e = eles.FirstOrDefault(x => x.TagName == "div" && x.Attributes.ContainsKey("class") && x.Attributes["class"].ToLower().Contains("main-content"));
/**查找id為mainp的p標(biāo)簽*/
var e = eles.FirstOrDefault(x => x.TagName == "p" && x.Attributes.ContainsKey("id") && x.Attributes["id"].ToLower() == "mainp");

第七步 請隨意發(fā)揮~

?文章來源地址http://www.zghlxwxcb.cn/news/detail-839991.html

到了這里,關(guān)于以對象的方式訪問html中的標(biāo)簽,比正則表達(dá)式更好用的方式獲取html中的內(nèi)容,linq方式直接獲取所有的鏈接,更加先進(jìn)的c#版本爬蟲開源庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Python高級教程(1)——正則表達(dá)式(re.match、re.search、re.sub、compile、findall、finditer、split)、正則表達(dá)式對象、正則表達(dá)式實例

    Python高級教程(1)——正則表達(dá)式(re.match、re.search、re.sub、compile、findall、finditer、split)、正則表達(dá)式對象、正則表達(dá)式實例

    正則表達(dá)式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。 (1)re.match函數(shù) re.match 嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match() 就返回 none。 函數(shù)語法: 通過re.match匹配成功,可以使?group?法來提取數(shù)據(jù)

    2024年02月04日
    瀏覽(36)
  • 正則表達(dá)式以及 pattern 的撰寫方式

    在Python中,可以使用re模塊來進(jìn)行正則表達(dá)式的撰寫和匹配。下面是一個基本的正則表達(dá)式撰寫方法示例: 定義正則表達(dá)式模式: 其中,r表示原始字符串,可以避免轉(zhuǎn)義字符的問題。

    2024年02月08日
    瀏覽(22)
  • 正則表達(dá)式中的“回引用(回溯)”——別名引用與序號引用的差異及正則表達(dá)式中的“P”關(guān)鍵字

    正則表達(dá)式中的“回引用(回溯)”——別名引用與序號引用的差異及正則表達(dá)式中的“P”關(guān)鍵字

    讀到一段巧妙的正則表達(dá)式,勾起我對正則表達(dá)式欠缺知識點的探尋: P y t h o n Python P y t h o n 正則表達(dá)式中的“回引用 (回溯) ”——分組別名引用與序號引用的差異及正則表達(dá)式中的“P”詳情。 (筆記模板由python腳本于2024年01月14日 07:49:35創(chuàng)建,本篇筆記適合 熟悉基

    2024年01月19日
    瀏覽(33)
  • JavaScript中的正則表達(dá)式

    正則表達(dá)式是一種強(qiáng)大的工具,可以在多種編程語言中使用,包括JavaScript。它們允許您在文本中查找和匹配模式,以及執(zhí)行各種操作,如替換、拆分和驗證。在JavaScript中,正則表達(dá)式通常用來檢查字符串是否符合某種特定模式,并且可以用來從字符串中提取特定的子字符串

    2024年02月02日
    瀏覽(23)
  • JS中的正則表達(dá)式

    正則就是一種規(guī)則的的表達(dá)式,書寫一段規(guī)則,用于匹配一段字符串是否符合規(guī)則 創(chuàng)建正則表達(dá)式 創(chuàng)建正則表達(dá)式有兩種方式: 1.字面量的形式 2.內(nèi)置構(gòu)造函數(shù)的形式 1.匹配(test) 匹配字符串是否符合正則規(guī)則 符合—true 不符合—false 語法: 正則.test(字符串) 2.捕獲 語法:正則.exe

    2024年02月05日
    瀏覽(16)
  • oracle中的正則表達(dá)式

    ^ 使表達(dá)式定位至一行的開頭 $ 使表達(dá)式定位至一行的末尾 * 匹配 0 次或更多次 ? 匹配 0 次或 1 次 + 匹配 1 次或更多次 {m} 正好匹配 m 次 {m,} 至少匹配 m 次 {m, n} 至少匹配 m 次但不超過 n 次 [:alpha:] 字母字符 [:lower:] 小寫字母字符 [:upper:] 大寫字母字符 [:digit:] 數(shù)字 [:alnum:] 字母數(shù)

    2024年02月09日
    瀏覽(19)
  • js中的正則表達(dá)式(一)

    js中的正則表達(dá)式(一)

    目錄 1.什么是正則表達(dá)式 2.正則表達(dá)式在JavaScript中的使用場景: ?3.正則表達(dá)式的語法: 正則表達(dá)式(Regular Expression)是用于匹配字符串中字符組合的模式。在JavaScript中,正則表達(dá)式也是對象通常用來查找、替換那些符合正則表達(dá)式的文本,許多語言都支持正則表達(dá)式。 例如

    2024年02月12日
    瀏覽(28)
  • Python中的正則表達(dá)式(一)

    Python中的正則表達(dá)式(一)

    在Python中,正則表達(dá)式是一種用于匹配和操作字符串的強(qiáng)大工具。正則表達(dá)式由一系列字符和特殊字符組成,用于定義搜索模式。 在Python中,我們使用內(nèi)置的 re 模塊來操作正則表達(dá)式。要使用正則表達(dá)式,我們首先需要導(dǎo)入 re 模塊。 下面是一些常用的正則表達(dá)式的定義:

    2024年02月20日
    瀏覽(24)
  • 從Google網(wǎng)頁中通過正則表達(dá)式獲取json如何轉(zhuǎn)換unicode對象

    場景: Google爬蟲,獲取下拉框搜索,需要獲取頁面的里面的json字符串如下面: \\\'{\\\\x22aa\\\\x22:{},\\\\x22abd\\\\x22:{\\\\x22abd\\\\x22:false,\\\\x22deb\\\\x22:false,\\\\x22det\\\\x22:false},\\\\x22async\\\\x22:{},\\\\x22attn\\\\x22:{},\\\\x22bgd\\\\x22:{\\\\x22ac\\\\x22:true,\\\\x22as\\\\x22:true,\\\\x22at\\\\x22:0,\\\\x22ea\\\\x22:true,\\\\x22ed\\\\x22:0,\\\\x22ei\\\\x22:tru

    2024年04月13日
    瀏覽(17)
  • 防止 JavaScript 中的正則表達(dá)式回溯

    正則表達(dá)式是用于在軟件應(yīng)用程序中操作和驗證文本的強(qiáng)大工具。然而,某些正則表達(dá)式模式可能容易受到回溯的影響,這可能會導(dǎo)致超線性運行時,并可能導(dǎo)致DoS攻擊。在本文中,我們將探討什么是回溯、它如何導(dǎo)致性能問題以及如何在正則表達(dá)式中防止回溯。 回溯是正則

    2024年02月12日
    瀏覽(38)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包