以对象的方式访问html中的标签,比正则表达式更好用的方式获取html中的内容,linq方式直接获取所有的链接,更加先进的c#版本爬虫开源库

这篇具有很好参考价值的文章主要介绍了以对象的方式访问html中的标签,比正则表达式更好用的方式获取html中的内容,linq方式直接获取所有的链接,更加先进的c#版本爬虫开源库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这是我本人自己写的一个开源库,现已经发布到nuget,可以直接在vs的nuget包管理中搜索到,或者可以到nuget官网下载:https://www.nuget.org/packages/ZmjConvert/,也可以到我的个人网站上下载源码: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标准库包,可以在.NET core,.NET,.NET framework等多种项目中直接使用,我本人也是在多种环境中使用这个包,没有任何问题的,我本人主要用来提取网页上的链接,图片,可显示文本等内容。

先安装这个包,然后就可以使用了,下面给出了一些使用方式的模板:

第一步 序列化html

/**这是html源码的序列化*/
1
var dts = GetSource();//获取html源码,可以现下或者读取html文件,dts需要是string类型的html内容 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的源地址的当前文档的url,用于将当前所有节点中相对路径解析为绝对路径时使用 8 eles = HtmlElement.GetAllElement(eles);//列出所有的子元素,就是将所有的节点提取为一个list,方便使用linq,或者使用foreach循环来遍历,当然原来的标签结构是不会改变的。
 1 /**这是部分html标签源码的反序列化,比如富文本编辑器的内容*/
 2 try
 3 {
 4     var labstr = Gethtmlstr();//获取部分标签的html源码,比如富文本编辑器
 5     var eles = CHtmlElement<HtmlElement>.Parse(htmlstr);//反序列化标签组
 6     return eles;//反序列化成功后返回结构对象
 7 }
 8 catch (Exception e)
 9 {
10     throw e;//反序列化失败
11 }

第二步 获取html文档的标题

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标签的src,也就是获取所有页面上的图片

1 /**这是获取所有img标签的src属性内容*/
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标签的data-src属性,因为有些网站为了降低流量成本,img标签的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标签的href,也就是获取所有页面上的链接

1 /**获取所有的链接及链接的文本内容*/
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>();//这是按行存储的提取到的所有可视内容
 3 var sb = new StringBuilder();//这是中间使用的拼接对象
 4 foreach (var item in eles)//eles为整个html反序列化后的列表,如果需要对指定的一个div或者p的可视内容提取,可以先找到这个标签对象,然后在通过HtmlElement.GetAllElement(e.Children)可提取他的所有子标签,就可以提取所有可视内容了
 5 {
 6     var tgs = new[] { "br", "div", "li", };//这是强迫换行的标签列举,可根据需求添加或减少
 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 }

第六步 找到特定的标签

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标签*/
var e = eles.FirstOrDefault(x => x.TagName == "p" && x.Attributes.ContainsKey("id") && x.Attributes["id"].ToLower() == "mainp");

第七步 请随意发挥~

 文章来源地址https://www.toymoban.com/news/detail-839991.html

到了这里,关于以对象的方式访问html中的标签,比正则表达式更好用的方式获取html中的内容,linq方式直接获取所有的链接,更加先进的c#版本爬虫开源库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python高级教程(1)——正则表达式(re.match、re.search、re.sub、compile、findall、finditer、split)、正则表达式对象、正则表达式实例

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 (1)re.match函数 re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。 函数语法: 通过re.match匹配成功,可以使⽤group⽅法来提取数据

    2024年02月04日
    浏览(68)
  • 正则表达式以及 pattern 的撰写方式

    在Python中,可以使用re模块来进行正则表达式的撰写和匹配。下面是一个基本的正则表达式撰写方法示例: 定义正则表达式模式: 其中,r表示原始字符串,可以避免转义字符的问题。

    2024年02月08日
    浏览(58)
  • 正则表达式中的“回引用(回溯)”——别名引用与序号引用的差异及正则表达式中的“P”关键字

    读到一段巧妙的正则表达式,勾起我对正则表达式欠缺知识点的探寻: P y t h o n Python P y t h o n 正则表达式中的“回引用 (回溯) ”——分组别名引用与序号引用的差异及正则表达式中的“P”详情。 (笔记模板由python脚本于2024年01月14日 07:49:35创建,本篇笔记适合 熟悉基

    2024年01月19日
    浏览(47)
  • JS中的正则表达式

    正则就是一种规则的的表达式,书写一段规则,用于匹配一段字符串是否符合规则 创建正则表达式 创建正则表达式有两种方式: 1.字面量的形式 2.内置构造函数的形式 1.匹配(test) 匹配字符串是否符合正则规则 符合—true 不符合—false 语法: 正则.test(字符串) 2.捕获 语法:正则.exe

    2024年02月05日
    浏览(45)
  • JavaScript中的正则表达式

    正则表达式是一种强大的工具,可以在多种编程语言中使用,包括JavaScript。它们允许您在文本中查找和匹配模式,以及执行各种操作,如替换、拆分和验证。在JavaScript中,正则表达式通常用来检查字符串是否符合某种特定模式,并且可以用来从字符串中提取特定的子字符串

    2024年02月02日
    浏览(41)
  • oracle中的正则表达式

    ^ 使表达式定位至一行的开头 $ 使表达式定位至一行的末尾 * 匹配 0 次或更多次 ? 匹配 0 次或 1 次 + 匹配 1 次或更多次 {m} 正好匹配 m 次 {m,} 至少匹配 m 次 {m, n} 至少匹配 m 次但不超过 n 次 [:alpha:] 字母字符 [:lower:] 小写字母字符 [:upper:] 大写字母字符 [:digit:] 数字 [:alnum:] 字母数

    2024年02月09日
    浏览(43)
  • js中的正则表达式(一)

    目录 1.什么是正则表达式 2.正则表达式在JavaScript中的使用场景:  3.正则表达式的语法: 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在JavaScript中,正则表达式也是对象通常用来查找、替换那些符合正则表达式的文本,许多语言都支持正则表达式。 例如

    2024年02月12日
    浏览(46)
  • Python中的正则表达式(一)

    在Python中,正则表达式是一种用于匹配和操作字符串的强大工具。正则表达式由一系列字符和特殊字符组成,用于定义搜索模式。 在Python中,我们使用内置的 re 模块来操作正则表达式。要使用正则表达式,我们首先需要导入 re 模块。 下面是一些常用的正则表达式的定义:

    2024年02月20日
    浏览(50)
  • 从Google网页中通过正则表达式获取json如何转换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日
    浏览(39)
  • 防止 JavaScript 中的正则表达式回溯

    正则表达式是用于在软件应用程序中操作和验证文本的强大工具。然而,某些正则表达式模式可能容易受到回溯的影响,这可能会导致超线性运行时,并可能导致DoS攻击。在本文中,我们将探讨什么是回溯、它如何导致性能问题以及如何在正则表达式中防止回溯。 回溯是正则

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包