如何通过power query提取多个网站中的多个表

Posted

技术标签:

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

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

需要知道代码

【问题讨论】:

您需要向我们提供更多信息。具体是什么给你带来了麻烦?到目前为止,您尝试过什么来解决您的问题?能给我们网站吗?您要获取的数据是什么? @RyanB。感谢您帮助我。 感谢您的帮助。我需要从多个网站中提取数据,每个网站中都有多个表。现在我已经能够从不同的网站提取信息,但我能够在每个网站中提取一个表。 (howtoexcel.org/power-query/…)。我已经使用这种方法来废弃数据。以下是示例网站 - (goo-net-exchange.com/catalog/NISSAN__BLUEBIRD)、(goo-net-exchange.com/catalog/NISSAN__BASSARA)、(goo-net-exchange.com/catalog/NISSAN__CARAVAN_COACH) 我需要一种方法来提取那些 URL 中的所有表。标题是一样的。非常感谢您的帮助。 【参考方案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)=> s0 & c, s1 & "Data." & c) in Table.ExpandTableColumn(Custom1, "Data", c0, c1) 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 非常感谢您帮助我。生病试试这个,应该工作。太棒了。

以上是关于如何通过power query提取多个网站中的多个表的主要内容,如果未能解决你的问题,请参考以下文章

Power BI:如何在 Power Query 编辑器中将 Python 与多个表一起使用?

如何使用Power Query动态汇总文件夹下多个Excel文件

使用“List.Zip”替换 Power Query / Power BI / M 代码中的多个列值

用于在多个 Excel 文件中列出 Power Query 源依赖项的脚本

在一个 Power Query 中合并多个工作簿中的相同选项卡

如何在Power Query中提取数据?——数值篇