【问题标题】:How to extract multiple tables in a multiple website through power query如何通过power query提取多个网站中的多个表
【发布时间】:2019-02-28 18:04:11
【问题描述】:

想知道通过power query提取网站中的数据表,表头相同,多个网站的表结构相同。

需要知道代码

【问题讨论】:

标签: excel database powerbi powerquery


【解决方案1】:

在 PQ 中创建空查询,进入高级编辑器,按 Ctrl-A,然后粘贴此文本:

= (url) => let Source = Web.Page(Web.Contents(url)), Custom1 = Table.SelectRows(Source, each Value.Is([Data], type table) and Table.RowCount([Data])>0 and List.First(Table.ColumnNames([Data])) = "MODEL TYPE"), #"Expanded Data" = let c = List.Accumulate(Table.ColumnNames(List.First(Custom1[Data])), {{},{}}, (s,c)=> {s{0} & {c}, s{1} & {"Data." & c}}) in Table.ExpandTableColumn(Custom1, "Data", c{0}, c{1}) in #"Expanded Data"

将查询命名为例如“问” 然后导入一个包含所有 url 的表格,并使用

向其中添加一个自定义列
Q(Name of column with urls)

如果 PQ 要求您这样做,您可能必须将隐私级别设置为公开。

然后展开添加的列。就是这样。

【讨论】:

  • 嘿@Andery 非常感谢您帮助我。你节省了我的时间。再次感谢。
【解决方案2】:

如果我的理解正确,这可能会有所帮助。这将从网站 goo-net-exchange.com/catalog/NISSAN__BLUEBIRD 上的所有表中获取所有数据,并附加到一个表中。

在 Power Query 中,单击主页 > 新源 > 其他源 > Web。然后输入你的链接并点击确定:

然后点击文件夹,点击确定。

然后过滤掉不是表格的 Source。

然后右键单击数据列的标题并删除其他列。

然后点击展开所有表格。

点击确定。

*****在您的评论/问题后添加*****

我进入 Power Query 并打开了从上述活动创建的查询。然后我将 Source 行中的 "http://www.goo-net-exchange.com/catalog/NISSAN__BLUEBIRD/" 更改为 Site,因此该行现在显示为:Source = Web.Page(Web.Contents(Site)),

然后我在代码中的原始 let 上方插入这两行,仍然保留原始 let (所以现在有两个 let)行:

let 
Source = (Site) =>

然后我在原来的最后一行代码下面插入了这两行:

in
Source

这四行代码把我之前的东西变成了一个函数。

接下来,我将查询重命名为 CarSites...只是因为我喜欢它。

然后我确保所有内容都已保存并返回到 Excel。

在 Excel 中,我用您的三个网站的 URL 制作了一个新表格:

我将表命名为 Table1。

然后我单击表 (Table1),然后单击数据 > 从表以从该表在 Power Query 中创建另一个查询。

然后我点击添加列>调用自定义函数,并设置如下条目,然后点击确定:

它给了我这个:

CarSites 列中的每个表都是 LinkURL 列中列出的每个站点的附加表的集合(就像您之前对 Nissan BlueBird 站点所做的那样)。您可以删除 LinkURL 列并展开 CarSites 列以获取所有站点的一个附加列。

根据我从表格信息中看到的信息,您仍然需要做一些工作来使用您提取的这些信息进行清理。例如,这些表格并不容易表明每条线路提供的信息是哪辆车和哪一年。您需要弄清楚如何将名称和年份映射到每一行。

您需要在函数中完成这项工作。

祝你好运!

如果有帮助,这是我的 M 代码:

对于 CarSites 功能:

let 
Source = (Site) =>
let
Source = Web.Page(Web.Contents(Site)),
#"Filtered Rows" = Table.SelectRows(Source, each ([Source] = "Table")),
#"Removed Other Columns" = Table.SelectColumns(#"Filtered Rows",{"Data"}),
#"Expanded Data" = Table.ExpandTableColumn(#"Removed Other Columns", "Data", {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "MODEL TYPE", "MODEL", "ENGINE", "DOOR", "T/M DRIVE", "Dimension", "WEIGHT", "MSRP", "Find Used Cars"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "MODEL TYPE", "MODEL", "ENGINE", "DOOR", "T/M DRIVE", "Dimension", "WEIGHT", "MSRP", "Find Used Cars"})
in
#"Expanded Data"
in
Source

对于 Table1 查询:

let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Invoked Custom Function" = Table.AddColumn(Source, "CarSites", each CarSites([LinkURL]))
in
#"Invoked Custom Function"

【讨论】:

  • 嗨@mar​​c,上面方法的问题是,大约有100多个网站(不同的车型),所以如果我做上面的方法会花费很长时间。有什么方法可以一次性列出所有 URL 并提取每个网站中的所有表格。请告诉我。非常感谢您的帮助。真的很感激。
  • 我在上一个答案的末尾添加了更多内容,以解决自动从多个站点获取信息的问题。
  • 嗨,Marc 非常感谢您帮助我。生病试试这个,应该工作。太棒了。
猜你喜欢
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多