ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: chou680702

[求助] 如何汇入web多頁的資料

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-1-4 18:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
您好,
感谢您提供的语法,贴上后是可行的。
但套用在其他网页,不知道为何还是不行,
例如:
https://www.finmart.com.tw/join/Online

因为发电中的案场要点选view more才会带出其他的,也是使用post语法,不知我这样套用有什么错误的地方?

let
    url="https://www.finmart.com.tw/join/ProjectList",
    headers=[#"Content-Type"="application/x-www-form-urlencoded; charset=UTF-8",Referer="https://www.finmart.com.tw/join/Online"],
    content="status=2&page=2&orderType=03",
    web=Web.Page(Text.FromBinary(Web.Contents(url,[Headers=headers,Content=Text.ToBinary(content)]))),
    Data = web{0}[Data]
in
    web

TA的精华主题

TA的得分主题

发表于 2022-1-6 22:50 | 显示全部楼层
chou680702 发表于 2022-1-4 18:11
您好,
感谢您提供的语法,贴上后是可行的。
但套用在其他网页,不知道为何还是不行,

let
    url="https://www.finmart.com.tw/join/ProjectList",
    headers=[#"Content-Type"="application/x-www-form-urlencoded; charset=UTF-8",Referer="https://www.finmart.com.tw/join/Online"],
    content="status=2&page=2&orderType=03",
    web=Web.Page(Text.FromBinary(Web.Contents(url,[Headers=headers,Content=Text.ToBinary(content)]))),
    Data = web{0}[Data]
in
    Data

TA的精华主题

TA的得分主题

发表于 2022-1-7 11:03 | 显示全部楼层
chou680702 发表于 2022-1-4 18:11
您好,
感谢您提供的语法,贴上后是可行的。
但套用在其他网页,不知道为何还是不行,

因为网页结构非常复杂,并不是每种结构是适用一个模板,我也是多次尝试后才能确定下来。一般来说,但凡Text.FromBinary能解析处网页源码,就是说明我们确实得到数据了,至于能否用Web.Page来解析的话,这个看实际情况了,对于本例而言是不能的,只能用Power Query的数据清洗功能。事实上,如果你用Power BI的Power Query效果会更好,里面有更加强大的Web.BrowserContents和Html.Table,这个两个解析函数都是Excel中阉割的Power Query所没有的,而且还可以借助css选择器来选择。下面附上我针对此列的解决方案:
  1. let
  2.     get_data=(x)=>
  3.                     let
  4.                     url="https://www.finmart.com.tw/join/ProjectList",
  5.                     headers=[#"Content-Type"="application/x-www-form-urlencoded; charset=UTF-8",Referer="https://www.finmart.com.tw/join/Online"],
  6.                     content="status=2&page="&Text.From(x)&"&orderType=03",
  7.                     web=Text.FromBinary(Web.Contents(url,[Headers=headers,Content=Text.ToBinary(content)])),
  8.                     分离 = Table.FromColumns({Text.SplitAny(web,"><")}),
  9.                     筛选 = Table.SelectRows(分离, each not Text.Contains([Column1], "span") and not Text.Contains([Column1], "div") and not Text.Contains([Column1], "/p") and not Text.Contains([Column1], "class")),
  10.                     删字 = Table.TransformColumns(筛选,{{"Column1", Text.Trim, type text}}),
  11.                     去空 = Table.SelectRows(删字, each ([Column1] <> "")),
  12.                     分组 = Table.Group(去空,"Column1",{"tb",each let tb=Table.FromColumns(List.Split({"状态"}&[Column1],2)),sl=Table.TransformColumns(tb,{"Column3",each if  List.Contains({"一".."龟"},Text.Start(_,1)) then "名称" else tb[Column3]{0}&_&"号"}) in Table.PromoteHeaders(sl)},0,(x,y)=>Number.From(y="發電中")),
  13.                     修正 = Table.TransformColumns(Table.Combine(分组[tb]),{"預估內部報酬率",each _&"%"}),
  14.                     改类型 = Table.TransformColumnTypes(修正,{{"預估內部報酬率", Percentage.Type}})
  15.                     in
  16.                     改类型,
  17.     数据=Table.Combine(List.Transform({1..4},get_data))
  18. in
  19.     数据
复制代码


TA的精华主题

TA的得分主题

发表于 2022-1-7 20:51 | 显示全部楼层
这个网页的XML用PQ里面的函数解析不了,否则会简单很多

另一种思路,大部分功能可以在PQ里面可视化完成

let
    url="https://www.finmart.com.tw/join/ProjectList",
    headers=[#"Content-Type"="application/x-www-form-urlencoded; charset=UTF-8",Referer="https://www.finmart.com.tw/join/Online"],
    Page = {1..4},
    content=List.Transform(Page, each "status=2&page="&Text.From(_)&"&orderType=03"),
    web=List.Transform(content, each Text.FromBinary(Web.Contents(url, [Headers=headers,Content=Text.ToBinary(_)]))),
    Split_Text = List.Combine(List.Transform(web, each Text.Split(_, "#(lf)"))),
    Extract = List.RemoveMatchingItems(List.Transform(Split_Text, each Text.BetweenDelimiters(_, ">","<")),{"#(cr)", "","預估內部報酬率","截至目前發電總量","截至目前發電金額"}),
    data = Table.Transpose(Table.FromColumns(List.Split(Extract,7)),{"状态","商轉起始日","名称","号码","預估內部報酬率","截至目前發電總量","截至目前發電金額"})
in
    data

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-1-8 05:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 chou680702 于 2022-1-8 09:28 编辑

谢谢提供二种解法,测试过后都可带出完整资料。
但因为很多函数不常用,可能还需要再消化一下。
第二种解法较简洁,但对于content以后的写法,较无法瞭解其逻辑,
是否有推荐的学习资源呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-2-11 13:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 chou680702 于 2022-2-11 15:38 编辑
excel_rzlt 发表于 2022-1-7 20:51
这个网页的XML用PQ里面的函数解析不了,否则会简单很多

另一种思路,大部分功能可以在PQ里面可视化完成
...

另请教,如果遇到多页,但是依区域名称来筛选,要如何一次抓出全部的数据?

以附件网站为例,要如何抓出全部的服务据点?因为要分别选取多个县市才能一一抓取,用POWER BI也只一次抓取一个县市的资料。

https://www.kymco.com.tw/locations/
2022-02-11_135210-1.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 05:24 , Processed in 0.035352 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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