zoukankan      html  css  js  c++  java
  • 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}	{Price}	{Total}	{Address}	{Title}	{ImageUrl}	{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

    不会飞的鱼~~~~梦想总要有的,万一实现了呢!
    尊重他人劳动成功。转载请注明出处! http://www.cnblogs.com/flyfishing/
  • 相关阅读:
    vue中使用vw适配移动端
    在vue项目中使用scss
    前端用vue怎么接收并导出文件
    QT编辑
    前置声明
    morphologyEx() getStructuringElement()
    # 类定义中调用另一个类函数的方式
    指针
    NEW
    DECLARE_DYNAMIC IMPLEMENT_DYNAMIC
  • 原文地址:https://www.cnblogs.com/flyfishing/p/HtmlToEntity.html
Copyright © 2011-2022 走看看