Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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
如何使用selenium和python在循环中发送多个关键字进行搜索?_Python_List_Selenium_Selenium Webdriver_Webdriver - Fatal编程技术网

如何使用selenium和python在循环中发送多个关键字进行搜索?

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

我目前正在将一个关键字传递到搜索框中,并使用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.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没有附加到页面文档不幸的是,没有这么简单。代码仍然只读取第一个关键字并获得相关的搜索结果。