【问题标题】:How to crawl a webpage with selectors?如何使用选择器抓取网页?
【发布时间】:2020-05-30 03:44:54
【问题描述】:

我正在抓取一个网页: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 命令选择年份?

【问题讨论】:

    标签: python selenium web-crawler


    【解决方案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
    
    

    【讨论】:

      【解决方案2】:

      您可以使用 selenium 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')
      

      但是,如果您仍想使用 option 来单击项目,请使用此代码。

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 2021-05-29
        • 2019-02-22
        • 1970-01-01
        • 2017-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多