如何使用选择器抓取网页?

时间:2020-05-30 03:44:54

标签: python selenium web-crawler

我正在爬行一个网页: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 个答案:

答案 0 :(得分:1)

使用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

答案 1 :(得分:1)

您可以使用硒Select()类从下拉菜单中选择项目。

要处理动态元素,请诱导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