Net Core 基于AngleSharp的HTML转实体工具

 最近这几天在采集一些房产信息网站的二手房产数据。采用的是.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  阅读(461)  评论(0编辑  收藏  举报