一尘不染

从使用Power BI的网站中收集数据-从网站上的Power BI中检索数据

selenium

我想从此页面(以及与之相似的页面)中删除数据:https : //cereals.ahdb.org.uk/market-
data-centre/historical-data/feed-
ingredreds.aspx

该页面使用Power BI。不幸的是,找到一种报废Power
BI的方法很困难,因为每个人都想报废使用/报废Power
BI,而不是从报废。最接近的答案是这个问题。却无关。

首先,我使用了Apache
tika
,很快我意识到在加载页面之后就已经在加载表数据了。我需要页面的渲染版本。

因此,我使用了Selenium。我想Select All从一开始(发送Ctrl+A组合键),但是它不起作用。也许它受页面事件的限制(我也尝试使用开发人员工具删除所有事件,但仍然Ctrl+A无法正常工作。

我也尝试读取HTML内容,但是Power BI
div使用position:absolute并区分表中的位置div(行和列)将元素显示在屏幕上是一项艰苦的工作。

由于Power BI使用JSON,因此我尝试从那里读取数据。但是,它是如此复杂,以至于我找不到规则。似乎将关键字放在某个位置并在表中使用它们的索引。

注意 :我意识到所有数据都不会加载,甚至不会同时显示。div类的A scroll-bar-part- bar负责充当滚动条,并进行移动以加载/显示数据的其他部分。

我用来读取数据的代码如下。如上所述,生成的数据的顺序与在浏览器上呈现的顺序不同:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

options = webdriver.ChromeOptions()
options.binary_location = "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
driver = webdriver.Chrome(options=options, executable_path="C:/Drivers/chromedriver.exe")

driver.get("https://app.powerbi.com/view?r=eyJrIjoiYjVjM2MyNjItZDE1Mi00OWI1LWE5YWYtODY4M2FhYjU4ZDU1IiwidCI6ImExMmNlNTRiLTNkM2QtNDM0Ni05NWVmLWZmMTNjYTVkZDQ3ZCJ9")
parent = driver.find_element_by_xpath('//*[@id="pvExplorationHost"]/div/div/div/div[2]/div/div[2]/div[2]/visual-container[4]/div/div[3]/visual/div')
children = parent.find_elements_by_xpath('.//*')
values = [child.get_attribute('title') for child in children]

感谢您解决上述任何问题。对于我而言,最有趣的是约定以JSON格式存储Power BI数据。


阅读 204

收藏
2020-06-26

共1个答案

一尘不染

将滚动部分和JSON放在一边,我设法读取了数据。关键是读取父级内部的所有元素(在问题中完成):

parent = driver.find_element_by_xpath('//*[@id="pvExplorationHost"]/div/div/div/div[2]/div/div[2]/div[2]/visual-container[4]/div/div[3]/visual/div')
children = parent.find_elements_by_xpath('.//*')

然后使用它们的位置对它们进行排序:

x = [child.location['x'] for child in children]
y = [child.location['y'] for child in children]
index = np.lexsort((x,y))

要对我们在不同行中阅读的内容进行排序,此代码可能会有所帮助:

rows = []
row = []
last_line = y[index[0]]
for i in index:
    if last_line != y[i]:
        row.append[children[i].get_attribute('title')]
    else:
        rows.append(row)
        row = list([children[i].get_attribute('title')]
rows.append(row)
2020-06-26