如何使用selenium和python在循环中发送多个关键字进行搜索?
我目前正在将一个关键字传递到搜索框中,并使用selenium单击搜索按钮。通过这样做,我得到了正确的页面。下面是我的一个关键字的工作代码如何使用selenium和python在循环中发送多个关键字进行搜索?,python,list,selenium,selenium-webdriver,webdriver,Python,List,Selenium,Selenium Webdriver,Webdriver,我目前正在将一个关键字传递到搜索框中,并使用selenium单击搜索按钮。通过这样做,我得到了正确的页面。下面是我的一个关键字的工作代码 page = driver.get('my_url') searchbox = driver.find_elements_by_name('searchterm')[1] #pass search keywords here searchbox.send_keys('key1') # single keyword passed button = driver
page = driver.get('my_url')
searchbox = driver.find_elements_by_name('searchterm')[1]
#pass search keywords here
searchbox.send_keys('key1') # single keyword passed
button = driver.find_element_by_xpath("//div[contains(@class, 'submit-btn')]")
button.click()
"""
Extract data from links
"""
div = driver.find_elements_by_class_name('search-result')
links_list = []
for tags in div:
links = (tags.find_elements_by_css_selector('a'))
for elem in links:
links_list.append(elem.get_attribute('href'))
但是,我希望传入一个关键字列表,以便代码对列表中的每个项目进行迭代。例如,如果我有一个列表
keys = ['key1', 'key2', 'key3', ...]
for key in keys:
page = driver.get('my_url')
searchbox = driver.find_elements_by_name('searchterm')[1]
#pass search keywords here
searchbox.send_keys(key) # single keyword passed
button = driver.find_element_by_xpath("//div[contains(@class, 'submit-btn')]")
button.click()
"""
Extract data from links
"""
div = driver.find_elements_by_class_name('search-result')
links_list = []
for tags in div:
links = (tags.find_elements_by_css_selector('a'))
for elem in links:
links_list.append(elem.get_attribute('href'))
如何将列表中的下一个关键字作为搜索词传递并执行相同的操作?显然,我已经尝试使用for循环来迭代关键字列表,但这不起作用,因为结果只给出列表中第一个关键字的搜索结果。您可以使用for语句来迭代列表
for key in keys:
searchbox.send_keys(key) # single keyword passed
button = driver.find_element_by_xpath("//div[contains(@class, 'submit-btn')]")
button.click()
也许这样行吗
keys = ['key1', 'key2', 'key3']
links_list = []
# loop through all keys and search for them
for key in keys:
searchbox = driver.find_elements_by_name('searchterm')[1]
searchbox.send_keys(key)
button = driver.find_element_by_xpath("//div[contains(@class, 'submit-btn')]")
button.click()
# go through all the search results per key and add them to the links_list
div = driver.find_elements_by_class_name('search-result')
for tags in div:
links = (tags.find_elements_by_css_selector('a'))
for elem in links:
links_list.append(elem.get_attribute('href'))
根据您当前的问题,您正在将单个关键字传递到搜索框中,然后单击搜索按钮,这样您就可以获得正确的页面。现在,如果您希望传入关键字列表,以便代码对列表中的每个项目进行迭代,您可以声明该列表,例如,在循环中逐个传递列表项目,如下所示:
keys = ['Selenium', 'WebDriver', 'guru']
# other lines of code
initial_url = driver.current_url
for key in keys:
searchbox = driver.find_elements_by_name('searchterm')[1]
#pass search keywords here
searchbox.send_keys('key') # single keyword passed
button = driver.find_element_by_xpath("//div[contains(@class, 'submit-btn')]")
button.click()
"""
Extract data from links
"""
div = driver.find_elements_by_class_name('search-result')
links_list = []
for tags in div:
links = (tags.find_elements_by_css_selector('a'))
for elem in links:
links_list.append(elem.get_attribute('href'))
driver.get(initial_url)
不幸的是,事情并非如此简单。在写这个问题之前,我尝试实现了这一点,但我得到了一个错误:StaleElementReferenceException:Message:stale element reference:element未附加到页面文档StaleElementReferenceException通常在您有WebElement变量并且页面发生更改时发生。这使得对页面上元素的引用无效。因此,我在循环的每个迭代中再次查找WebElement变量。如果您在第一个循环之外初始化
searchbox
元素,则当页面在搜索后更改或刷新时,可能会出现这些错误。你复制粘贴我的代码来看看它是否真的有效吗?所以我复制了你的代码,现在它有效了。似乎除了您提到的错误修复之外,另一个问题是我正在初始化循环中的空链接列表。在循环之外调用它是解决方法。感谢民间的帮助,这只是大脑放屁的时刻之一。:)很高兴听到这个!我知道代码需要一个for循环,其中列表是迭代的。这不是问题所在。我一直在尝试通过关键字列表实现for循环,但每次我都会收到错误消息:StaleElementReferenceException:message:stale-element-reference:element没有附加到页面文档不幸的是,没有这么简单。代码仍然只读取第一个关键字并获得相关的搜索结果。