Net Core 基于AngleSharp的HTML转实体工具
最近这几天在采集一些房产信息网站的二手房产数据。采用的是.net core 2.2+AngleSharp做的,放在自己服务器上跑着玩。写着写着,发现好麻烦。原因如下
部分代码如下图
1、每个节点都要手动写代码采集;
2、要采集的数据可能是内容,也可能是属性;
3、还要特殊处理一些字符,例如去除一些 平米、万、m²、等等等等;
于是,就想着,如果有一个工具,我只需要将要采集的属性标记一下,仍给你html内容,你给我组装好的实体。多好。
以下是一个DEMO 类
[HtmlNode(Selector = ".sellListContent li", IsSingle = false)]
public class FangJia
{
/// <summary>
/// 标题
/// </summary>
[HtmlNode(Selector = ".title", ValueFrom = HtmlNode.Content)]
public string Title { get; set; } /// <summary>
/// 图片地址
/// </summary>
[HtmlNode(Selector = "img[class='lj-lazy']", ValueFrom = HtmlNode.Attribute, AttributeValue = "data-original")]
public string ImageUrl { get; set; } /// <summary>
/// 价格
/// </summary>
[HtmlNode(Selector = ".unitPrice", ValueFrom = HtmlNode.Attribute, AttributeValue = "data-price")]
public int Price { get; set; } /// <summary>
/// 总价
/// </summary>
[HtmlNode(Selector = ".totalPrice", ValueFrom = HtmlNode.Content, TrimCharacter = "万,元", IsSingle = true)]
public decimal Total { get; set; } /// <summary>
/// 小区名称
/// </summary>
[HtmlNode(Selector = ".positionInfo a", Index = , ValueFrom = HtmlNode.Content)]
public string CommunityName { get; set; } /// <summary>
/// 地址
/// </summary>
[HtmlNode(Selector = ".positionInfo a", Index = , ValueFrom = HtmlNode.Content)]
public string Address { get; set; } /// <summary>
/// 标签
/// </summary>
[HtmlNode(Selector = ".tag span", IsSingle = false, ValueFrom = HtmlNode.Content)]
public string Marks { get; set; } public override string ToString()
{
return $"{CommunityName}\t{Price}\t{Total}\t{Address}\t{Title}\t{ImageUrl}\t{Marks}";
}
}
简单说一下
Selector 要采集的样式选择器,子节点是按照相对于主节点路径的选择器,按照 AngleSharp 标准来的。网上资料很多就不再多说;
IsSingle 是否只有一个节点,默认为 true,true只采集第一个有效节点,false 将采集所有节点数据,虽然可能只返回一条;
ValueFrom 要采集的数据来源,有 Content(文字内容),Html(html内容),Attribute(属性),None(不采集);
AttributeValue 从那个属性中获取内容,当 ValueFrom 为 Attribute 时有效;
Index 要选择的节点 从1 开始,默认为1,当 IsSingle 为 false 时无效;
TrimCharacter 要去除的字符,多个用","分割,采集时将会去除的内容;
测试程序
static void TestHtmlToEntity()
{
var html = HttpClient.Get("https://hz.lianjia.com/ershoufang/xihu/", null, out var success, ); var entitys = html.ToList<FangJia>();
if (entitys != null)
foreach (var entity in entitys)
Console.WriteLine(entity);
}
运行结果如下,数据已正常采集
代码地址:https://gitee.com/sunnyfish/HtmlToEntity
AngleSharp 官网https://anglesharp.github.io/
github 地址 https://github.com/AngleSharp/AngleSharp
Net Core 基于AngleSharp的HTML转实体工具的更多相关文章
- 记一次企业级爬虫系统升级改造(二):基于AngleSharp实现的抓取服务
爬虫系统升级改造正式启动: 在第一篇文章,博主主要介绍了本次改造的爬虫系统的业务背景与全局规划构思: 未来Support云系统,不仅仅是爬虫系统,是集爬取数据.数据建模处理统计分析.支持全文检索资源库 ...
- ASP.NET Core 基于JWT的认证(二)
ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...
- (18)ASP.NET Core 基于现有数据库创建EF模型(反向工程)
1.简介 Entity Framework Core可通过数据库提供给应用程序的插件访问许多不同的数据库.我们可以通过使用Entity Framework Core构建执行基本数据访问的ASP.NET ...
- ASP.NET Core 基于JWT的认证(一)
ASP.NET Core 基于JWT的认证(一) Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计 ...
- asp.net core系列 26 EF模型配置(实体关系)
一.概述 EF实体关系定义了两个实体互相关联起来(主体实体和依赖实体的关系,对应数据库中主表和子表关系). 在关系型数据库中,这种表示是通过外键约束来体现.本篇主要讲一对多的关系.先了解下描述关系的术 ...
- Asp.Net Core基于JWT认证的数据接口网关Demo
近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...
- .net core 基于Claim登录验证
网站,首先需要安全,实现安全就必须使用登录验证,.net core 基于Claim登录验证就很简单使用. Claim是什么,可以理解为你的身份证的中的名字,性别等等的每一条信息,然后Claim组成一个 ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- .net core 基于 IHostedService 实现定时任务
.net core 基于 IHostedService 实现定时任务 Intro 从 .net core 2.0 开始,开始引入 IHostedService,可以通过 IHostedService ...
随机推荐
- Redis单节点数据同步到Redis集群
一:Redis集群环境准备 1:需要先安装好Redis集群环境并配置好集群 192.168.0.113 7001-7003 192.168.0.162 7004-7006 2:检查redis集群 [r ...
- 优秀的github项目学习
优秀的github项目学习 后期会陆续添加遇到的优秀项目 https://github.com/chaijunkun
- centos7 防火墙屏蔽IP
1.屏蔽指定IP:124.115.0.199 iptables -I INPUT -s 124.115.0.199 -j DROP 2.屏蔽IP段: iptables -I INPUT -s 61.3 ...
- js 日常正则
手机号 /^1((3[\d])|(4[5,6,9])|(5[0-3,5-9])|(6[5-7])|(7[0-8])|(8[1-3,5-8])|(9[1,8,9]))\d{8}$/ 大写字母 /^[A- ...
- 有效的减少代码中太多的if、else?-策略模式
写这篇文章的目的和上一篇单例模式一样,策略模式也是一种常用的设计模式,太多的if-else不仅看着不太美观而且不好维护,对于自己来说也等于复习了一遍策略模式.先说一下策略 模式的定义: 策略模式封装了 ...
- Xamarin.Forms 学习系列之优秀UI收集
1.各种优秀UI例子 https://github.com/jsuarezruiz/xamarin-forms-goodlooking-UI 输入框例子 https://github.com/enis ...
- C# VS2019 WebService创建与发布,并部署到Windows Server 2012R
前言 上一次数据库灾备和性能优化后,数据库专家建议,在不扩容的情况下,客户端不能再频繁的扫描数据库了!一句惊醒梦中人,因为我也发现数据库越来越卡了,自从上个项目上线后,就出现了这个情况.后来分析其原因 ...
- AWS re:Invent 2019 召开 | 云原生生态周报 Vol. 30
作者 | 何淋波.宋净超.徐迪 业界要闻 1. AWS re:Invent 2019 AWS 年度云计算盛会于 12.2-12.6 在拉斯维加斯举行. 技术分享超过 2500 场,技术方向涵盖数据分析 ...
- C语言l博客作业01
2.1 你对软件工程专业或者计算机科学与技术专业了解是怎样?(2分) 计算机科学与技术是国家一级学科,下设信息安全,软件工程,计算机软件与理论等专业,主要培养符合教育部门实际需要的计算机教学及应用管理 ...
- Spring Boot SpringApplication启动类(一)
目录 目录 前言 1.起源 2.SpringApplication 准备阶段 2.1.推断 Web 应用类型 2.2.加载应用上下文初始器 ApplicationContextInitializer ...