Как сканировать веб-страницу с помощью селекторов? - PullRequest
0 голосов
/ 30 мая 2020

Я просматриваю веб-страницу: ogimet.com Это мой код:

import time
from urllib.request import urlopen
from bs4 import BeautifulSoup
from selenium import webdriver

#this path may be different on your cpu, you need to install a browser driver
driver = webdriver.Chrome(executable_path=r'C:/Users/jcrav/Desktop/driver/chromedriver.exe')
url="http://www.ogimet.com/"
driver.get(url)
#driver = webdriver.Chrome(driver) 
#driver.get(url)

the_link = driver.find_element_by_xpath('/html/body/table/tbody/tr[2]/td[1]/div[19]/a')
the_link.click()
time.sleep(2)

desplegable_pais = driver.find_element_by_css_selector('select[name="estado"] option[value="Peru"]')
desplegable_pais.click()
time.sleep(2)

Проблема в том, что некоторые селекторы не имеют переменной с именем value. Когда я выбираю страну, в селекторе есть переменная с именем value.

<option value="Peru">Perú</option>

Но когда я выбираю год, переменная с именем value отсутствует

<option>2004</option>

Как я могу выбрать год с помощью команды .click?

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Вы можете использовать селен Select () класс для выбора элемента из раскрывающегося списка.

Для обработки динамики c element вызвать WebDriverWait () и ждать element_to_be_clickable ( )

Код:

driver.get("http://www.ogimet.com/")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Sondeos por territorios"))).click()
select=Select(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select[name='estado']"))))
select.select_by_value('Peru')
selectyear=Select(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//select[@name='ano']"))))
selectyear.select_by_visible_text('2004')

Однако, если вы все еще хотите использовать опцию , чтобы щелкнуть элемент, используйте этот код.

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//select[@name='ano']/option[text()='2004']"))).click()

Если вы хотите параметризовать этот код, попробуйте следующий код.

year='2004'
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//select[@name='ano']/option[text()='{}']".format(year)))).click()

Вам необходимо импортировать следующие библиотеки.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
1 голос
/ 30 мая 2020

используйте element.text, чтобы найти то, что вы хотите

Ниже приведен пример

want_year_num = 2004
elements = driver.find_elements_by_xpath('/html/body/table/tbody/tr[2]/td[2]/form/table[3]/tbody/tr[2]/td[2]/select/option')
for element in elements:
    if element.text == str(want_year_num):
        element.click()
        break

...