我想从此页面(以及与之相似的页面)中删除数据: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无法正常工作。
Select All
Ctrl+A
我也尝试读取HTML内容,但是Power BI div使用position:absolute并区分表中的位置div(行和列)将元素显示在屏幕上是一项艰苦的工作。
div
position:absolute
由于Power BI使用JSON,因此我尝试从那里读取数据。但是,它是如此复杂,以至于我找不到规则。似乎将关键字放在某个位置并在表中使用它们的索引。
注意 :我意识到所有数据都不会加载,甚至不会同时显示。div类的A scroll-bar-part- bar负责充当滚动条,并进行移动以加载/显示数据的其他部分。
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数据。
将滚动部分和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)