开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 23188|回复: 122
收起左侧

[2018开源大赛(第三届)] 史上最强html解析库

    [复制链接]
结帖率:100% (1/1)
发表于 2018-11-18 18:00:46 | 显示全部楼层 |阅读模式   山西省大同市
本帖最后由 123456ytr 于 2018-11-18 18:02 编辑


git地址:https://github.com/1694439208/gumbo-Elss

使用易语言这么久了没有找到任何一个好用易用的html解析库
直到遇上了
Gumbo
参考了css选择器和xpath选择器语法,结合了两种方便之处

  1. 语法组成:指令

  2.             3大基本语法:标签名  .class值   #id值

  3.             多条指令使用语法:指令1 > 指令2 > 指令3 > ...

  4.             基本语法规范:
  5.             ----------------------------------------------------
  6.             字符串和属性使用单引号或者双引号引起来
  7.             ----------------------------------------------------


  8.             基本函数:
  9.             ----------------------------------------------------
  10.             find(属性,内容)   为查找属性值为内容的标签
  11.             fuzzyfind(属性,内容)   为查找属性值包含内容的标签
  12.             tojson(json节点名称,提取的节点名称,生成json字段别名,提取的属性)
  13.             tojson将来可以处理复杂嵌套,目前只支持一层对象,,多个属性,例如:
  14.                     {
  15.                             "test":[
  16.                                     {
  17.                                             "href":"www.baidu.com"
  18.                                     },
  19.                                     {
  20.                                             "href":"www.baidu.com"
  21.                                     }
  22.                             ]
  23.                     }
  24.             //将来会根据需求增加一些api
  25.             参数2内置属性对应:
  26.                     this => 自身节点
  27.                     如不是上述name则为表达式,例如:
  28.                             div > .info:tojson(NodeList,div>a,link,href)

  29.                             上述表达式 选取div节点后class为info的节点并且提取此节点下的 div>a>p 子节点的href属性
  30.                             NodeList为生成json的节点名称,link生成json字段别名
  31.                             {
  32.                                     "NodeList":[
  33.                                         {
  34.                                             "link":"//book.qidian.com/info/1001324565"
  35.                                         }]
  36.                             }

  37.             参数3内置属性对应:
  38.                     Text => 节点内容
  39.                     Html => 节点html
  40.                     如不是上述name则提取属性内容

  41.             例如:
  42.                           div>h4>a:tojson(NodeList,this,href,href):tojson(NodeList,this,title,Text)
  43.                           {
  44.                                     "NodeList":[
  45.                                         {
  46.                                             "href":"//book.qidian.com/info/1001324565",
  47.                                             "title":"降临诸天"
  48.                                         },
  49.                                         {
  50.                                             "href":"//book.qidian.com/info/1012835812",
  51.                                             "title":"某美漫的神级强化师"
  52.                                         }
  53.                                     ]
  54.                                 }

  55.             生成json属性名称会使用参数命名,
  56.             如果提取本节点则 提取的节点名称填写 this
  57.             例如:
  58.                     表达式:
  59.                     div > a > div:tojson(title,this,Text,Text) //Text默认为节点内容

  60.                                 结果:
  61.                                 {
  62.                             "title":{
  63.                                     ["Text":"测试内容"]
  64.                             }
  65.                     }

  66.                     表达式:
  67.                     div > a > div:tojson(内容,this,class,class)

  68.                     结果:
  69.                     {
  70.                             "内容":{
  71.                                     ["class":"info"]
  72.                             }
  73.                     }

  74.             如某个节点下有多项提取内容可使用链式提取,
  75.             例如:
  76.                     <div>
  77.                             <title>标题</title>
  78.                             <div>2017/5/9</div>
  79.                             <div>测试内容</div>
  80.                     </div>
  81.                     <div>
  82.                             <title>标题</title>
  83.                             <div>2017/5/9</div>
  84.                             <div>测试内容</div>
  85.                     </div>
  86.                     <div>
  87.                             <title>标题</title>
  88.                             <div>2017/5/9</div>
  89.                             <div>测试内容</div>
  90.                     </div>

  91.                     表达式:div:tojson(title,title,title,Text):tojson(time,div[0],time,Text):tojson(data,div[1],data,Text)
  92.                     结果:
  93.                     {
  94.                             "内容":[
  95.                                     {"title":"标题","time":"2017/5/9","data":"测试内容"},
  96.                                     {"title":"标题","time":"2017/5/9","data":"测试内容"},
  97.                                     {"title":"标题","time":"2017/5/9","data":"测试内容"}
  98.                             ]
  99.                     }


  100.             ----------------------------------------------------


  101.             基本功能1:
  102.             ----------------------------------------------------
  103.             说明:我想获取a标签的所有内容

  104.             <a>1</a>
  105.             <a>2</a>
  106.             <a>3</a>

  107.             指令:a
  108.             ----------------------------------------------------

  109.             基本功能2:
  110.             ----------------------------------------------------
  111.             说明:我想获取id为list1的div里面的a标签的所有内容

  112.             <div id="list1">
  113.                 <dl>
  114.                     <dd>
  115.                         <a>1</a>
  116.                     </dd>
  117.                     <dd>
  118.                         <a>2</a>
  119.                     </dd>
  120.                      <dd>
  121.                         <a>3</a>
  122.                     </dd>
  123.                 </dl>
  124.             </div>
  125.             <div id="list2">
  126.                 <dl>
  127.                     <dd>
  128.                         <a>4</a>
  129.                     </dd>
  130.                     <dd>
  131.                         <a>5</a>
  132.                     </dd>
  133.                      <dd>
  134.                         <a>6</a>
  135.                     </dd>
  136.                 </dl>
  137.             </div>


  138.             指令1:#list1 > dl > dd > a
  139.             或
  140.             指令2:div:find('id','list1') > dl > dd > a
  141.             ----------------------------------------------------

  142.             功能1:
  143.             ----------------------------------------------------
  144.             说明:指令前面是. 则为匹配class属性,要匹配出233

  145.             <div class="test">233</div>

  146.             指令:.test
  147.             ----------------------------------------------------


  148.             功能2:
  149.             ----------------------------------------------------
  150.             说明:指令前面是# 则为匹配id属性,要匹配出233

  151.             <div id="test">233</div>  

  152.             指令:#test
  153.             ----------------------------------------------------


  154.             功能3:
  155.             ----------------------------------------------------
  156.             说明:如果想指定标签属性筛选,要匹配出233

  157.             <div id="test">233</div>
  158.             <div id="test">266</div>  

  159.             指令:div:find('id','test')
  160.             ----------------------------------------------------


  161.             功能4:
  162.             ----------------------------------------------------
  163.             说明:如果想指定标签属性模糊筛选,要匹配出233和266

  164.             <div id="test_123">233</div>
  165.             <div id="test_456">266</div>

  166.             指令:div:fuzzyfind('id','test_')
  167.             ----------------------------------------------------
复制代码


当然如果你对开源代码完全不感兴趣又或者只想用成品请下载附件模块源码和使用demo



elss[6.1].rar

503.83 KB, 下载次数: 1605, 下载积分: 精币 -2 枚

123.png

点评

支持一下   河北省石家庄市  发表于 2018-11-18 18:06

评分

参与人数 14好评 +14 精币 +35 收起 理由
胆小的老虎 + 1 + 10 感谢发布原创作品,精易因你更精彩!
maryma + 1 + 1 支持开源~!感谢分享
亚子 + 1 + 5 似乎不错i
xgrjw + 1 + 3 很好很强悍,坚持下去哦~
jiaqq02 + 1 + 3 大神,请收下我的膝盖
鐵憨憨 + 1 + 2 支持开源~!感谢分享
流星暴雨 + 1 + 2 支持开源~!感谢分享
熊猫巴布 + 1 + 2 支持开源~!感谢分享
leiyh + 1 + 1 奉上小小红包希望笑纳
可乐cl + 1 + 2 我读书少,不要骗我
荭枫 + 1 支持开源~!感谢分享
是大哥吖 + 1 + 1 感谢分享,很给力!~
futrueface + 1 支持开源~!感谢分享
镇坛道德标杆 + 1 + 3 支持开源~!感谢分享

查看全部评分

本帖被以下淘专辑推荐:

结帖率:100% (1/1)

签到天数: 9 天

发表于 2024-10-7 23:30:40 | 显示全部楼层   福建省福州市
感谢分享!!!!厉害
回复 支持 反对

使用道具 举报

发表于 2024-9-21 16:34:13 | 显示全部楼层   四川省成都市
学习一下
回复 支持 反对

使用道具 举报

发表于 2024-9-1 14:22:50 | 显示全部楼层   福建省厦门市
学习学习
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 7 天

发表于 2024-4-18 10:51:30 | 显示全部楼层   四川省成都市
支持以下6666
回复 支持 反对

使用道具 举报

发表于 2024-4-12 22:12:24 | 显示全部楼层   山东省济宁市
66666666666666666666666
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2023-11-10 00:35:54 | 显示全部楼层   四川省宜宾市
        支持开源~!感谢分享
回复 支持 反对

使用道具 举报

发表于 2023-6-13 21:21:54 | 显示全部楼层   广东省广州市
感谢分享!!!!厉害
回复 支持 反对

使用道具 举报

发表于 2023-6-13 21:21:37 | 显示全部楼层   广东省广州市
感谢分享!!!!66666
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2022-11-30 23:21:41 高大上手机用户 | 显示全部楼层   重庆市重庆市
感谢分享!!!!
回复 支持 反对

使用道具 举报

结帖率:63% (5/8)
发表于 2022-11-16 09:00:32 | 显示全部楼层   重庆市重庆市
66666666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表