2017-02-23 68 views
2

Я пытаюсь использовать селен, чтобы помочь получить данные с веб-сайта, который использует javascript для загрузки информации.Как найти элементы в таблице с Python и Selenium?

Вы можете увидеть ссылку здесь: Animal population

страница показывает некоторые выбираемые поля, для моей цели я пытаюсь получить данные о популяции пчел, в Соединенном Королевстве за 2011 год

После отправки выбранных полей страница будет загружать таблицу с соответствующими данными. Я хочу только получить Население и Плотность номера для Вся страна.

В моем коде пока не указаны поля года, страны и вида, и после возвращения таблицы он находит поле «Вся страна» (не стесняйтесь сообщать мне, как улучшить мой существующий код тоже).

Мне не удалось получить поля народонаселения и плотности для всей страны, я попытался использовать xpath и «следующий родной брат», но он показывает и исключает, чтобы найти элементы.

Я также не хочу полагаться на позицию строк/ячеек, так как я также попытаюсь получить эту информацию в течение следующих лет, и поля таблицы изменят положение.

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import Select 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

driver = webdriver.Firefox() 
driver.get('https://www.oie.int/wahis_2/public/wahid.php/Countryinformation/Animalpopulation') 



select = Select(driver.find_element_by_id('country6')) 
select.select_by_value('GBR') 
select = Select(driver.find_element_by_id('year')) 
select.select_by_value('2011') 

try: 
    element = WebDriverWait(driver, 40).until(EC.presence_of_element_located((By.CLASS_NAME, "TableContent "))) 
    print element 
    select = Select(driver.find_element_by_id('selected_species')) 
    select.select_by_value('1') 
except: 
    print "Not found" 

country_td = driver.find_element(By.XPATH, '//td/b[text()="The Whole Country"]') 

#population_td = driver.find_element(By.XPATH, '//td/b[text()="The Whole Country"]/following-sibling::text()') 
print country_td.text 

Благодарим за помощь.

ответ

3

Вы должны пойти на один уровень вверх, чтобы получить данные с помощью following-sibling

population = driver.find_element(By.XPATH, ('//td[b[text()="The Whole Country"]]/following-sibling::td[1]') 
density = driver.find_element(By.XPATH, ('//td[b[text()="The Whole Country"]]/following-sibling::td[2]') 

Или с помощью country_td

population = country_td.find_element(By.XPATH, ('/../following-sibling::td[1]') 
density = country_td.find_element(By.XPATH, ('/../following-sibling::td[2]') 
+0

спасибо, первый ответ работает. Я изменил синтаксисы: population = driver.find_element (By.XPATH, '// td [b [текст() = «Вся страна»]]/следующее-сиблинг :: td [1]') плотность = driver.find_element (By.XPATH, '// td [b [текст() = «Вся страна»]]/следующее-сиблинг :: td [2]') – Ana

3

Что following-sibling делает в вашем примере ищет следующий родственный элемент типа <b>. Что вы хотите, это элемент типа <td>. Но вы также можете использовать родительский элемент.

для населения XPath
//b[text()="The Whole Country"]/../../td[4]/b

Или
//td/b[text()="The Whole Country"]/../following-sibling::td[1]/b

для плотности XPath
//b[text()="The Whole Country"]/../../td[5]/b

Или
//td/b[text()="The Whole Country"]/../following-sibling::td[2]/b

Оба вида XPaths работают. Использование .. приведет ваш xpath к родительскому элементу, который вам нужно выполнить, и чем вы можете перейти к одному из братьев или найти элемент, используя td[X]. В этом примере вы также можете опустить последний /b на каждый xpath.

Примечание: это действительно противно, лучше всего всегда использовать однозначные атрибуты для поиска элемента. Однако это не всегда возможно, как показано в этом примере.

Кроме того, вы должны сначала выбрать «Пчелы» и ждать, пока таблица будет присутствовать, так как таблица загружается между выбором года/страны и выбором «Пчелы», что может привести к непоследовательным данным.

select = Select(driver.find_element_by_id('selected_species')) 
select.select_by_value('1') 
element = WebDriverWait(driver, 40).until(EC.presence_of_element_located((By.CLASS_NAME, "TableContent "))) 
print element 

PS: Существует расширение хром называется XPath Helper, который вы можете использовать, чтобы проверить свои XPaths на веб-сайте вы посещаете.

+0

Отлично, спасибо! Резонанс почему я не выбрал пчел в первую очередь потому, что после выбора пчел таблица снова загрузится, и предварительно выбранное поле видов снова выберет «все виды» – Ana

+0

Хорошо, я понимаю. Но я боюсь, что вы столкнулись с такими проблемами, как получение неверных данных, потому что таблица не перезагрузилась перед использованием xpath или запущена в «NoSuchElementException». Предотвращение этого было бы намного проще, если бы элементы имели уникальные атрибуты. –

Смежные вопросы