Очистка данных с веб-сайта, использующего Power BI, - получение данных из Power BI на веб-сайте - PullRequest
3 голосов
/ 08 марта 2019

Я хочу удалить данные с этой страницы (и страниц, похожих на нее): https://cereals.ahdb.org.uk/market-data-centre/historical-data/feed-ingredients.aspx

На этой странице используется Power BI .К сожалению, найти способ отказаться от Power BI сложно, потому что каждый хочет отказаться от использования / в Power BI, а не от него.Ближайший ответ был на этот вопрос .Пока не связано.

Во-первых, я использовал Apache tika , и вскоре я понял, что данные таблицы загружаются после загрузки страницы.Мне нужна визуализированная версия страницы.

Поэтому я использовал Селен .Я хотел Select All в начале (отправка Ctrl+A комбинация клавиш), но это не работает.Возможно, это ограничено событиями страницы (я также пытался удалить все события с помощью инструментов разработчика, но все равно Ctrl+A не работает.

Я также пытался читать содержимое HTML, но Power BI ставитdiv элементов на экране с использованием position:absolute и выделение местоположения div в таблице (строка и столбец) - трудоемкое занятие.

Поскольку Power BI использует JSON, я попытался прочитатьданные оттуда. Однако это так сложно, что я не могу выяснить правила. Кажется, он где-то кладет ключевые слова и использует их индексы в таблице.

Примечание : Я понял, что вседанных не загружается и даже отображается одновременно. div класса 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]

Я ценю решения для любой из перечисленных выше проблем.Эмс.Однако наиболее интересным для меня является соглашение о хранении данных Power BI в формате JSON.

1 Ответ

0 голосов
/ 13 марта 2019

Отложив часть прокрутки и 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...