Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何刮<;李>;是否使用类标记,如active/selected?_Python_Selenium_Web Scraping - Fatal编程技术网

Python 如何刮<;李>;是否使用类标记,如active/selected?

Python 如何刮<;李>;是否使用类标记,如active/selected?,python,selenium,web-scraping,Python,Selenium,Web Scraping,我想从一个网站上抓取一份清单。有两个不同的列表,只有在选择第一个选项后才会加载其中一个。问题是,我无法选择第一个选项。我粗略地列出了所有可用选项。但是写完之后,我必须从给定的选项中选择它,我无法这样做 我尝试过使用浏览器。通过css选择器(..)查找元素。单击(),但即使设置了正确的等待条件,它仍显示elementnotfound异常。我想那是因为它找不到那个元素 browser.find_element_by_css_selector("#Brand_name").send_keys(c

我想从一个网站上抓取一份清单。有两个不同的列表,只有在选择第一个选项后才会加载其中一个。问题是,我无法选择第一个选项。我粗略地列出了所有可用选项。但是写完之后,我必须从给定的选项中选择它,我无法这样做

我尝试过使用浏览器。通过css选择器(..)查找元素。单击(),但即使设置了正确的等待条件,它仍显示
elementnotfound
异常。我想那是因为它找不到那个元素

   browser.find_element_by_css_selector("#Brand_name").send_keys(company[i])
   element=  browser.find_element_by_css_selector("#Brand_name_selectWrap")
   browser.implicitly_wait(5) # seconds
   browser.find_element_by_css_selector("""#Brand_name_selectWrap > ul > li.selected""").click()
PS:下面是我正在尝试的链接。我需要全公司所有上市的手机。


有人能建议一些更好的方法吗?

该元素被另一个元素覆盖,因此您需要使用
ActionChains
来执行单击

您需要导入它:

from selenium.webdriver.common.action_chains import ActionChains
然后单击
输入
,仅在
发送键
之后:

input_el = browser.find_element_by_css_selector('#Brand_name')
ActionChains(browser).move_to_element(input_el).click().perform()
使用
WebDriverWait
验证您的条件是一种很好的做法:

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

wait = WebDriverWait(browser, 15)
input_el = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#Brand_name")))
ActionChains(browser).move_to_element(input_el).click().perform()

您可以将所有选项及其
rel
属性收集到一个字典中,然后使用适当的等待条件循环该字典,以使子列表出现:

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

d = webdriver.Chrome()
d.get('https://bangalore.quikr.com/Escrow/post-classifieds-ads/?postadcategoryid=227')
options = {i.get_attribute('textContent'):i.get_attribute('rel') for i in d.find_elements_by_css_selector('#Brand_name_selectWrap .optionLists li:not(.optionHeading) a')}
input_element = d.find_element_by_id('Brand_name')

for k,v in options.items():
    input_element.click()  
    input_element.send_keys(k)
    selector = '[rel="' + v + '"]'

    WebDriverWait(d, 3).until(EC.element_to_be_clickable((By.CSS_SELECTOR, selector))).click()
    WebDriverWait(d, 2).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#Model_selectWrap.showCustomSelect")))


我创建了一本字典,里面有手机的所有选项。键是输入框中的实际文本,值是这些元素的
rel
属性值。每个选项都有一个
rel
属性。这意味着我可以通过按键输入手机名称,以便生成下拉列表,从可能的值中选择您的手机,然后在css属性=值选择器中使用
rel
属性,确保我单击了正确的一个

锚定标记()中的
rel
属性描述链接指向的文档的关系


selector
变量仅通过其
rel
属性值保存当前css选择器以获取移动下拉选项。

hey!!这是一种魅力!但我不明白。您对选择器和选项做了什么?什么是真正的rel属性?你能详细解释一下吗@Qhari创建了一本字典,里面有手机的所有选项。键是输入框中的实际文本,值是这些元素的rel属性值。每个选项都有一个rel属性。这意味着我可以通过按键输入手机名称,以便生成下拉列表,从可能的值中选择手机,然后在css属性=值选择器中使用rel属性,确保我单击了正确的一个。锚定标记内的rel属性()描述链接指向的文档的关系。选择器变量仅保留当前css attribute=value选择器,以便通过其rel属性值获取移动下拉选项。