Я новичок в очистке данных, поэтому заранее извиняюсь, если упустил что-то основное.
Моя цель — извлечь данные из этой базы данных: https://ilthermo.boulder.nist.gov/
введите здесь описание изображения
Из того, что я читал, Beutiful Soup должен быть удобен для таких задач. К сожалению, URL-адрес базы данных не меняется при навигации. И прежде чем я перейду к интересующим меня страницам, мне нужно ввести ряд команд.
А именно мне нужно:
(1) Нажмите «Поиск ILthermo». (2) Введите имя компонента (3) Выберите количество компонентов (4) Выберите свойство
До этого момента я использовал Selenium, и все работало как надо.
Вот пример:
` из веб-драйвера импорта селена время импорта
chromedriver = "/users/Me/downloads/chromedriver"
driver = webdriver.Chrome(chromedriver)
driver.get('https://ilthermo.boulder.nist.gov/')
SearchILThermo = '//*[@id = "sbutton_label"]'
IonicLiquid = '//*[@id = "cmp"]'
NumberComp = '//*[@id = "ncmp"]'
Property = '//*[@id = "prp"]'
Submit = '//*[@id = "sDialog"]/div[2]/div[2]/span[1]'
driver.find_element_by_xpath(SearchILThermo).click()
time.sleep(1)
driver.find_element_by_xpath(IonicLiquid).send_keys("1-Butyl-3-methylimidazolium tetrafluoroborate")
driver.find_element_by_xpath(NumberComp).send_keys('1 - pure compound')
driver.find_element_by_xpath(Property).send_keys('Viscosity')
time.sleep(1)
driver.find_element_by_xpath(Submit).click()`
Эти строки приводят меня на следующую страницу:
введите здесь описание изображения
На этом этапе щелчок по строке на левой панели делает доступной таблицу на правой панели. Эти таблицы на правой панели — это то, что я хочу извлечь (вероятно, с помощью Beautiful Soup), начиная с первой строки на левой панели и циклически проходя по всем строкам всех страниц для набора входных данных, который я дал выше.
Итак, мне нужно:
(5) Нажмите на строку на левой панели (последовательно) (6) Извлеките таблицу на правой панели с помощью Beautiful Soup (еще не пробовали) (7) Прокрутите все строки и все страницы на левой панели.
Нажав на строку на левой панели, я сейчас застрял.
Из инструментов разработчика кажется, что xpath для каждой строки на левой панели выглядит примерно так:
1-й ряд:
//*[@id = "dsgrid-row-MOByt"]/table/tr
2-й ряд:
//*[@id = "dsgrid-row-hkDds"]/table/tr/
Если я сделаю:
Row = '//*[@id = "dsgrid-row-MOByt"]/table/tr' driver.find_element_by_xpath(Row).click()
Он нажимает на первую строку, как и должно. Но так как мне нужно перебрать все строки, мне нужно будет получить доступ к строкам в цикле. В идеале что-то вроде:
Row = '//*[@id = "dsgrid-row-i"]/table/tr'
Но, конечно, это не работает.
Существуют ли другие способы заставить Selenium щелкнуть определенную строку (учитывая ее номер) на левой панели?
Не уверен, что вам действительно следует использовать selenium
- requests
также может быть вариантом при использовании API.
Здесь вы получите результаты по ключевому слову:
f'https://ilthermo.boulder.nist.gov/ILT2/ilsearch?cmp=&ncmp=0&year=&auth=&keyw = {keyword}&prp=0'
Здесь вы получаете соответствующие данные для каждого набора:
f"https://ilthermo.boulder.nist.gov/ILT2/ilset?set = {d['setid']}"
Ограничено / сокращено до первых пяти результатов для демонстрации, просто подгоните его под свои нужды.
import requests
import pandas as pd
keyword = 'Viscosity'
url = f'https://ilthermo.boulder.nist.gov/ILT2/ilsearch?cmp=&ncmp=0&year=&auth=&keyw = {keyword}&prp=0'
ref_data = requests.get(url).json()
data = []
for e in ref_data['res'][:5]:
d = dict(zip(ref_data['header'],e))
set_data = requests.get(f"https://ilthermo.boulder.nist.gov/ILT2/ilset?set = {d['setid']}").json()
header = [item for items in set_data['dhead'] for item in items if item and item != 'Liquid']
header.append('Liquid')
for x in [[item for items in sublist for item in items] for sublist in set_data['data']]:
d.update(
dict(
zip(header, x)
)
)
data.append(d)
pd.DataFrame(data)