Веб-очистка таблицы, созданной функцией Javascript - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь очистить таблицу исследований по приведенной ниже ссылке

https://clinicaltrials.gov/ct2/results?cond=COVID&term=&cntry=&state=&city=&dist=

В таблице есть динамически созданное содержимое с использованием Javascript. Я пробовал использовать селен, но периодически получал StaleElementException. Пожалуйста, помогите мне с тем же.

Я хочу получить все строки в таблице и сохранить их в локальной базе данных. Вот что я пробовал в селене

 import selenium.webdriver as webdriver
 url = 'https://clinicaltrials.gov/ct2/results?cond=COVID&term=&cntry=&state=&city=&dist='
 driver=webdriver.Firefox()
 #driver.implicitly_wait(30)
 driver.get(url)
 data = []
 for tr in driver.find_elements_by_xpath('//table[@id="theDataTable"]//tbody//tr'):
  tds = tr.find_elements_by_tag_name('td')
   if tds:
    for td in tds:
     print(td.text)
     if td.text not in data:
      data.append(td.text)          
 driver.quit()
 print('*********************************************************************')
 print(data)

Далее данные из переменной data я сохраню в БД.

Я новичок в селене, веб-скрапинге и других аспектах, Я хочу нажимать на каждую ссылку в столбце «Название исследования» и извлекать данные с этой страницы для каждого исследования.

Мне нужны предложения, позволяющие избежать / обработать исключение устаревшего элемента или альтернативу для Selenium webdriver. Заранее спасибо!

1 Ответ

0 голосов
/ 08 мая 2020

Я попробовал следующий код, и все данные сохраняются правильно. Можете ли вы попробовать?

CODE

driver.get("https://clinicaltrials.gov/ct2/results?cond=COVID&term=&cntry=&state=&city=&dist=")


time.sleep(5)

array = []

flag = True
next_counter = 0

time.sleep(4)

select = Select(driver.find_element_by_name('theDataTable_length'))
select.select_by_value('100')

time.sleep(5)

while flag == True:
    if next_counter == 13:
        print("Stoped")
    else:
        item = driver.find_elements_by_tag_name("tbody")[1]
        rows = item.find_elements_by_tag_name('tr')

        for x in range(len(rows)):
            for i in range(7):
                array.insert(x, rows[x].find_elements_by_tag_name('td')[i].text)
                print(rows[x].find_elements_by_tag_name('td')[i].text)

        time.sleep(5)
    next = driver.find_element_by_id('theDataTable_next')
    next.click()
    next_counter = next_counter + 1


    time.sleep(7)

OUTPUT

1

Not yet recruiting
NEW
Indirect Endovenous Systemic Ozone for New Coronavirus Disease (COVID19) in Non-intubated Patients
COVID
Other: Systemic indirect endovenous ozone therapy
SEOT
Valencia, Spain
2

Recruiting
NEW
Prediction of Clinical Course in COVID19 Patients
COVID 19
Other: CT-Scan
Chu Saint-Etienne
Saint-Étienne, France
3

Not yet recruiting
NEW
Risks of COVID19 in the Pregnant Population
COVID19
Other: Biospecimen collection
Mayo Clinic in Rochester
Rochester, Minnesota, United States
4

Recruiting
NEW
Saved From COVID-19
COVID
Drug: Chloroquine
Drug: Placebo oral tablet
Columbia University Irving Medical Center/NYP
New York, New York, United States
5

Recruiting
NEW
Efficacy of Convalescent Plasma Therapy in Severely Sick COVID-19 Patients
COVID
Drug: Convalescent Plasma Transfusion
Other: Supportive Care
Drug: Random Donor Plasma
Maulana Azad medical College
New Delhi, Delhi, India
Institute of Liver and Biliary Sciences
New Delhi, Delhi, India
6

Not yet recruiting
NEW
A Real-life Experience on Treatment of Patients With COVID 19
COVID
Drug: Chloroquine
Drug: Favipiravir
Drug: Nitazoxanide
(and 3 more...)
Tanta university hospital
Tanta, Egypt
7

Recruiting
International COVID19 Clinical Evaluation Registry,
COVID 19
Combination Product: Observational (registry)
Hospital Lclinico San Carlos
Madrid, Spain
8

Completed
NEW
AiM COVID for Covid 19 Tracking and Prediction
COVID 19
Other: No Intervention
Aarogyam (UK)
Leicester, United Kingdom
9

Recruiting
NEW
Establishing a COVID-19 Prospective Cohort for Identification of Secondary HLH
COVID

Department of nephrology, Klinikum rechts der Isar
München, Bavaria, Germany
10

Recruiting
NEW
Max Ivermectin- COVID 19 Study Versus Standard of Care Treatment for COVID 19 Cases. A Pilot Study
COVID
Drug: Ivermectin
Max Super Speciality hospital, Saket (A unit of Devki Devi Foundation)
New Delhi, Delhi, India

Мой код выполняет следующие logi c шагов:

  • Во-первых, я выбираю вариант, чтобы увидеть 100 результатов, а не 10, чтобы сэкономить время на получение данных.
  • Во-вторых, я прочитал все результаты страницы (100) и когда я заканчиваю sh I go, чтобы щелкнуть по символу следующей страницы. Затем у меня есть команда сна, чтобы подождать 4 секунды (вы можете сделать это лучше, но я сделал это так, чтобы дать вам что-то быстрое - вам нужно вставить концепцию waitUntilElementIsVisible)
  • После нажатия на следующий страницы, я снова сохраняю результаты (100)
  • Эта функция будет работать до тех пор, пока флаг не станет ложным. Он будет ложным, когда next_counter будет 14 (больше 13, что является максимумом). Число 13 на самом деле равно 1300 (результаты), деленное на 100 (максимальное количество результатов на странице), поэтому 1300/100 = 13. Итак, у нас 13 страниц.

Редактирование и передача данных - это то, что вы может управлять, и нет необходимости в знаниях Selenium или в чем-то, что касается веб-автоматизации. Это концепция 100% Python.

...