最近这几天在采集一些房产信息网站的二手房产数据。采用的是.net core 2.2+AngleSharp做的,放在自己服务器上跑着玩。写着写着,发现好麻烦。原因如下

部分代码如下图

 

 

1、每个节点都要手动写代码采集;

2、要采集的数据可能是内容,也可能是属性;

3、还要特殊处理一些字符,例如去除一些 平米、万、m²、等等等等;

于是,就想着,如果有一个工具,我只需要将要采集的属性标记一下,仍给你html内容,你给我组装好的实体。多好。

以下是一个DEMO 类

 

 1     [HtmlNode(Selector = ".sellListContent li", IsSingle = false)]
 2     public class FangJia
 3     {
 4         /// <summary>
 5         /// 标题
 6         /// </summary>
 7         [HtmlNode(Selector = ".title", ValueFrom = HtmlNode.Content)]
 8         public string Title { get; set; }
 9 
10         /// <summary>
11         /// 图片地址
12         /// </summary>
13         [HtmlNode(Selector = "img[class='lj-lazy']", ValueFrom = HtmlNode.Attribute, AttributeValue = "data-original")]
14         public string ImageUrl { get; set; }
15 
16         /// <summary>
17         /// 价格
18         /// </summary>
19         [HtmlNode(Selector = ".unitPrice", ValueFrom = HtmlNode.Attribute, AttributeValue = "data-price")]
20         public int Price { get; set; }
21 
22         /// <summary>
23         /// 总价
24         /// </summary>
25         [HtmlNode(Selector = ".totalPrice", ValueFrom = HtmlNode.Content, TrimCharacter = "万,元", IsSingle = true)]
26         public decimal Total { get; set; }
27 
28         /// <summary>
29         /// 小区名称
30         /// </summary>
31         [HtmlNode(Selector = ".positionInfo a", Index = 1, ValueFrom = HtmlNode.Content)]
32         public string CommunityName { get; set; }
33 
34         /// <summary>
35         /// 地址
36         /// </summary>
37         [HtmlNode(Selector = ".positionInfo a", Index = 2, ValueFrom = HtmlNode.Content)]
38         public string Address { get; set; }
39 
40         /// <summary>
41         /// 标签
42         /// </summary>
43         [HtmlNode(Selector = ".tag span", IsSingle = false, ValueFrom = HtmlNode.Content)]
44         public string Marks { get; set; }
45 
46         public override string ToString()
47         {
48             return $"{CommunityName}\t{Price}\t{Total}\t{Address}\t{Title}\t{ImageUrl}\t{Marks}";
49         }
50     }

简单说一下

 Selector 要采集的样式选择器,子节点是按照相对于主节点路径的选择器,按照 AngleSharp 标准来的。网上资料很多就不再多说;

 IsSingle 是否只有一个节点,默认为 true,true只采集第一个有效节点,false 将采集所有节点数据,虽然可能只返回一条;

 ValueFrom 要采集的数据来源,有 Content(文字内容),Html(html内容),Attribute(属性),None(不采集);

 AttributeValue 从那个属性中获取内容,当 ValueFrom 为 Attribute 时有效;

 Index 要选择的节点 从1 开始,默认为1,当 IsSingle 为 false 时无效;

 TrimCharacter 要去除的字符,多个用","分割,采集时将会去除的内容;

测试程序

 1         static void TestHtmlToEntity()
 2         {
 3             var html = HttpClient.Get("https://hz.lianjia.com/ershoufang/xihu/", null, out var success, 10);
 4 
 5 
 6             var entitys = html.ToList<FangJia>();
 7             if (entitys != null)
 8                 foreach (var entity in entitys)
 9                     Console.WriteLine(entity);
10         }

运行结果如下,数据已正常采集

代码地址:https://gitee.com/sunnyfish/HtmlToEntity

 AngleSharp 官网 https://anglesharp.github.io/

 github 地址 https://github.com/AngleSharp/AngleSharp

posted @ 2019-12-18 20:19 flyfishing 阅读(462) 评论(0) 推荐(0) 编辑
摘要: 1 public static string Reverse(this String str) 2 { 3 char[] array = str.ToCharArray(); 4 int n = array.Length - 1; 5 for (int i = (n - 1) >> 1; i >= 0; i--) 6 { 7 int j = n - i; 8 char temp = array[i 阅读全文
posted @ 2019-11-21 17:08 flyfishing 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 缓存,在.Net系统开发中,经常使用到。如果,让你自己去实现,你会怎么做呢。 开始编码前思考: 1、肯定 是要 根据 key 去查询对应value,so 应该是List<KeyValuePair> 这类集合做缓存载体; 2、肯定是要全局公用,so 缓存的列表应该唯一; 3、应该有支持并发的能力,so 阅读全文
posted @ 2019-08-30 00:06 flyfishing 阅读(855) 评论(0) 推荐(0) 编辑
摘要: function SetPlatForm() { var JumpUrl = ""; var sUserAgent = navigator.userAgent.toLowerCase(); var bIsIpad = sUserAgent.match(/ipad/i) == "ipad"; var bIsIphoneOs = sUserAgent.match(/i... 阅读全文
posted @ 2016-07-21 08:28 flyfishing 阅读(816) 评论(0) 推荐(0) 编辑
摘要: 场景:明明iis中的字体文件存在,访问却出现404,登录服务器访问,依旧404,不过多了个提示,添加mime映射。恍然大悟。原来IIS默认不识别字体库文件。参考方案,在config文件中添加映射配置 阅读全文
posted @ 2016-07-15 15:20 flyfishing 阅读(1432) 评论(0) 推荐(0) 编辑
摘要: 正则验证html标签,正则验证div,正则验证a标签,正则验证 id、class固定的标签 阅读全文
posted @ 2015-05-18 17:56 flyfishing 阅读(3677) 评论(0) 推荐(0) 编辑
摘要: 纯css样式的三角形代码 阅读全文
posted @ 2015-04-28 16:08 flyfishing 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 打印网页时的样式问题 阅读全文
posted @ 2015-04-24 14:51 flyfishing 阅读(24200) 评论(0) 推荐(0) 编辑
摘要: JavaScript试题,里边着重讲了下 js中call方法。instanceof 方法的使用。 阅读全文
posted @ 2015-02-06 13:40 flyfishing 阅读(287) 评论(0) 推荐(0) 编辑
摘要: web开发中浏览器跨域问题,常遇到的问题 阅读全文
posted @ 2015-02-06 10:18 flyfishing 阅读(219) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示