添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
风流倜傥的木瓜  ·  vue ...·  49 分钟前    · 
酒量大的钥匙  ·  Oracle Database 12c ...·  16 小时前    · 
温柔的可乐  ·  sys.sp_cdc_cleanup_cha ...·  昨天    · 
飘逸的黄瓜  ·  Magic Tricks for ...·  2 天前    · 
失落的小虾米  ·  laravel join 子查询 ...·  2 天前    · 
腼腆的水龙头  ·  5 個常見的 POWER BI ...·  3 月前    · 
这是一个很基础的教程,高手飘过。
现在html中的<table>基本上都被用来展示一些重要的数据,有时候我们需要从html中的某些table里抓取数据,今天就简单介绍一下怎样从网页上抓取table标签中的数据。
利用aardio实现这个需求比较容易,一般情况下,我们用web.form加载网页后,通过wb.getEle()或wb.queryEles()得到table节点,然后用com.each()遍历其中的行、列就可以了得到其中单元格的数据了。先看一个简单的示例
示例1:
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="读取/修改 html 表格";right=687;bottom=447;max=false)
  4. winform.add(
  5. btnModifyCell={cls="button";text="修改表格内容";left=192;top=216;right=352;bottom=248;z=4};
  6. btnReadcell={cls="button";text="读取表格内容";left=16;top=216;right=176;bottom=248;z=3};
  7. custom={cls="custom";text="自定义控件";left=16;top=8;right=672;bottom=208;edge=1;z=1};
  8. listview={cls="listview";left=16;top=256;right=672;bottom=432;fullRow=1;edge=1;z=2}
  9. )
  10. /*}}*/

  11. import web.form;
  12. var wb = web.form(winform.custom);
  13. wb.html = /**
  14. <meta charset="utf-8"/>
  15. <table id="mytable">
  16. <thead>
  17. <tr>
  18. <th>ID</th>
  19. <th>Data</th>
  20. </tr>
  21. </thead>
  22. <tbody>
  23. <tr>
  24. <td>A</td>
  25. <td>第一行</td>
  26. </tr>
  27. <tr>
  28. <td>B</td>
  29. <td>第二行</td>
  30. </tr>
  31. <tr>
  32. <td>C</td>
  33. <td>第三行</td>
  34. </tr>
  35. </tbody>
  36. </table>
  37. <style type="text/css">
  38. table{
  39. width: 100%;
  40. border-collapse: collapse;
  41. }
  42. th,td{
  43. border: 1px solid #999;
  44. text-align: center;
  45. padding: 10px 0;
  46. }
  47. table thead tr{
  48. background-color: #008c8c;
  49. color: #fff;
  50. }
  51. </style>
  52. **/
  53. wb.wait();

  54. winform.btnReadcell.oncommand = function(id,event){
  55. var header = {}
  56. var datas = {}
  57. for i, row in com.each(wb.getEle("mytable").rows) {
  58. var rowtab = {}
  59. for j, cell in com.each(row.cells){
  60. if(i==1){
  61. table.push(header, cell.innerText)
  62. }else{
  63. //读html中的table字段
  64. rowtab[ header[j] ] = cell.innerText
  65. }
  66. }
  67. if(i>1) table.push(datas,rowtab)
  68. }
  69. winform.listview.setColumns(header)
  70. datas = table.mix(datas,{["fields"]=header})
  71. winform.listview.setTable( datas )
  72. }

  73. winform.btnModifyCell.oncommand = function(id,event){
  74. for i, row in com.each(wb.getEle("mytable").rows) {
  75. for j, cell in com.each(row.cells){
  76. if(i>1){/*不改动列头*/
  77. //修改html中的table字段
  78. cell.innerText  = cell.innerText ++ "♬️"
  79. }
  80. }
  81. }
  82. }

  83. winform.show();
  84. win.loopMessage();
复制代码
效果如下:
示例1非常简单,但是html内容是我们自己写的,只有最简单的一个table,并不是真实网络世界的table。
下面,我们对示例1的代码稍微修改一下,尝试从一个真实的网页中读取表格数据。
示例2:
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="读取/修改 html 表格";right=687;bottom=447)
  4. winform.add(
  5. btnModifyCell={cls="button";text="修改表格内容";left=192;top=216;right=352;bottom=248;dl=1;dt=0.48;z=4};
  6. btnReadcell={cls="button";text="读取表格内容";left=16;top=216;right=176;bottom=248;dl=1;dt=0.48;z=3};
  7. custom={cls="custom";text="自定义控件";left=16;top=8;right=672;bottom=208;db=0.54;dl=1;dr=1;dt=1;edge=1;z=1};
  8. listview={cls="listview";left=16;top=256;right=672;bottom=432;db=1;dl=1;dr=1;dt=0.57;edge=1;fullRow=1;z=2}
  9. )
  10. /*}}*/

  11. import web.form;
  12. var wb = web.form(winform.custom);
  13. wb.noScriptErr=true;

  14. wb.go("https://www.amac.org.cn/informationpublicity/institutionalpublicity/gmjjglrgs/")
  15. wb.wait();

  16. winform.btnReadcell.oncommand = function(id,event){
  17. var eles = wb.queryEles(tagName="table")
  18. if(!eles){return;}
  19. var header = {}
  20. var datas = {}
  21. for i, row in com.each(eles[1].rows) {
  22. var rowtab = {}
  23. for j, cell in com.each(row.cells){
  24. if(i==1){
  25. table.push(header, cell.innerText)
  26. }else{
  27. //读html中的table字段
  28. rowtab[ header[j] ] = cell.innerText
  29. }
  30. }
  31. if(i>1) table.push(datas,rowtab)
  32. }
  33. table.push(header,"")  //解决win10系统最后1列可能不显示的问题
  34. winform.listview.setColumns(header)
  35. datas = table.mix(datas,{["fields"]=header})
  36. winform.listview.setTable( datas )
  37. }

  38. winform.btnModifyCell.oncommand = function(id,event){
  39. var eles = wb.queryEles(tagName="table")
  40. if(!eles){return;}
  41. for i, row in com.each(eles[1].rows) {
  42. for j, cell in com.each(row.cells){
  43. if(i>1){/*不改动列头*/
  44. //修改html中的table字段
  45. cell.innerText  = cell.innerText ++ "♬️"
  46. }
  47. }
  48. }
  49. }
  50. winform.show();
  51. win.loopMessage();
复制代码
效果如下:
看,我们成功获取了外部网页的表格数据,并显示到listview控件中。
但是如果你仔细观察这个网页,你会发现其实它显示数据时使用了分页技术,每次table中只有10行数据,上面的代码只是将第一页的数据加载到listview中了。
实际上,该表格中所有的记录有156条,有点遗憾,我们每次只能从wb对象中得到10条记录,怎样才能一次抓取到表格中全部的记录呢?
很容易就发现,点击不同的页码后,jQuery在后台发送了"findMutualFundHousePage?pageNo=2&pageSize=10"这个请求,
从这个请求字符串大概可以明白,参数pageNo=2表示要请求的页码,pageSize=10表示每页显示的记录数,
然后把这个请求链接粘贴到浏览器地址栏,回车,发现返回的是json格式的数据集,呵呵,这就好办了!
为了一次显示所有记录数, 我们不再采用在webform中寻找节点这种方法了,改用inet.http + web.json来获取数据。
示例3:
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="读取所有公募基金管理人名录";right=687;bottom=447)
  4. winform.add(
  5. btngetAlldata={cls="button";text="读取所有公募基金管理人名录";left=16;top=216;right=344;bottom=248;dl=1;dt=0.48;z=3};
  6. custom={cls="custom";text="自定义控件";left=16;top=8;right=672;bottom=208;db=0.54;dl=1;dr=1;dt=1;edge=1;z=1};
  7. listview={cls="listview";left=16;top=256;right=672;bottom=432;db=1;dl=1;dr=1;dt=0.57;edge=1;fullRow=1;z=2}
  8. )
  9. /*}}*/

  10. import web.form;  //仅供在窗体中显示网页
  11. var wb = web.form(winform.custom);
  12. wb.noScriptErr=true;
  13. wb.go("https://www.amac.org.cn/informationpublicity/institutionalpublicity/gmjjglrgs/")
  14. wb.wait();

  15. import inet.http;
  16. import web.json;

  17. winform.btngetAlldata.oncommand = function(id,event){
  18. var eles = wb.queryEles(tagName="table")
  19. if(!eles){return;}

  20. //获取网页中表格头文本到listview列头
  21. var header = {}
  22. for i, cell in com.each(eles[1].rows[0].cells){
  23. table.push(header, cell.innerText)
  24. }
  25. table.push(header,"")
  26. winform.listview.setColumns(header)

  27. //获取表格中所有的记录
  28. var ret = inet.http().get("https://www.amac.org.cn/portal/front/mutualFund/findMutualFundHousePage?pageNo=1&pageSize=1000")
  29. var datas = web.json.parse(ret)
  30. datas = datas["data"].data.dataList;
  31. table.mix( datas, {["fields"]={"lineId","houseName","registerAddr","officeAddr"}} )
  32. winform.listview.setTable( datas )
  33. }

  34. winform.show();
  35. win.loopMessage();
复制代码
效果如下: