Power Query批量读取URL列表时仅首个URL有效其余返回Null的问题咨询
嘿,我来帮你搞定这个批量读取HTML文件的问题!
看你的描述,单个HTML文件读取完全没问题,但换成URL/文件路径列表后就只有第一个能拿到数据,其余全是Null,这大概率是因为你直接把单文件的代码改成列表后,Power Query没办法自动迭代处理每个路径——它只会处理第一个,剩下的就不知道该怎么搞了。
给你一套亲测有效的解决步骤,都是我平时处理批量文件常用的方法:
第一步:先把你的文件路径列表弄规整
首先确保你的路径列表里的格式是对的,比如直接用本地路径C:\Viking Family Htmls\591.html就行,不用转成file:///那种格式,File.Contents函数直接支持本地路径,转义反而容易出问题(比如你原来用的%20,其实Power Query能直接识别带空格的路径)。
第二步:封装单个文件读取的逻辑成自定义函数
把你原来能成功读取单个文件的代码改成带参数的函数,这样每个路径都能单独调用这个逻辑。具体代码如下:
let ReadSingleHtml = (htmlPath as text) => let Source = File.Contents(htmlPath), ExtractedTable = Html.Table(Source, {{"Column1", "BODY > TABLE:nth-child(1) > * > TR > :nth-child(1)"}}, [RowSelector="BODY > TABLE:nth-child(1) > * > TR"]) in ExtractedTable in ReadSingleHtml
你可以在Power Query的“主页”选项卡点击“高级编辑器”,把上面的代码粘贴进去,保存这个函数(比如命名为ReadSingleHtml)。
第三步:给你的路径列表添加自定义列调用函数
回到存放所有文件路径的表,点击“添加列”→“自定义列”,输入=ReadSingleHtml([你的路径列名称])(把括号里的换成你实际的列名,比如[URL]或者[文件路径])。
这一步做完后,每个路径对应的行都会调用我们写的函数,单独读取对应的HTML文件,而不是只处理第一个。
第四步:合并所有结果
这时候你会看到自定义列里每个单元格都是一个表,你只需要点击列标题旁边的展开按钮,选择“展开到新行”或者直接展开列,就能把所有HTML里的表合并成一个大表了。
补充小提示
如果还是有个别路径返回Null,你可以检查下对应的HTML文件是不是真的存在,或者HTML结构和第一个文件是不是完全一致——因为你用的CSS选择器是固定的,如果某个文件的表格位置不一样,也会读不到数据哦。
备注:内容来源于stack exchange,提问作者Ka Kevi

