当前位置: 首页 > 知识库问答 >
问题:

StaleElementReferenceException即使在使用Web Scraping从维基百科收集数据时添加了等待

袁霍英
2023-03-14

我是上网的新手。请原谅我的愚蠢错误,如果有的话。

我一直在做一个项目,我需要一个电影列表作为我的数据。我正试图通过网络搜索从维基百科中收集数据。

下面是我的代码:

def MoviesList(years, driver):
    for year in years:
        driver.implicitly_wait(150)
        year.click()
        table = driver.find_element_by_xpath('/html/body/div[3]/div[3]/div[5]/div[1]/table[2]/tbody')
        movies = table.find_elements_by_xpath('tr/td[1]/i/a')
        for movie in movies:
            print(movie.text)
        driver.back()
years = driver.find_elements_by_partial_link_text('List of Bollywood films of')
del years[:2]
MoviesList(years, driver)

试图从此页面获取年份列表并将其存储在years变量中。然后,我循环了所有这些年,试图提取出年度最佳10部电影。见此参考

产出:

Tanhaji
Baaghi 3
...
...
Panga
# Top movies of the year 2020
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document (from line year.click())
Tanhaji  
...
...
War  # First movie of the year 2019
Saaho
...
...
Vikram Urvashi  # Last movie of the year 1920
# Top movies of the year from 2020 to 1920

共有1个答案

戴化
2023-03-14

为了使用Selenium和python从wikipedia的宝莱坞电影列表中收集数据,您必须为visibility_of_all_elements_locited()导入WebDriverWait,您可以使用以下定位器策略:

注:作为示范,此计划仅限于收集前三(3)年全球总票房最高的电影

>

  • 代码块:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get("https://en.wikipedia.org/wiki/Lists_of_Bollywood_films")
    parent_window  = driver.current_window_handle
    years = [my_elem.get_attribute("href") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.PARTIAL_LINK_TEXT, "List of Bollywood films of")))[2:5]]
    print(years)
    for year in years:
        driver.execute_script("window.open('" + year +"')")
        WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
        windows_after = driver.window_handles
        new_window = [x for x in windows_after if x != parent_window][0]
        driver.switch_to_window(new_window)
        print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table/caption//following::tbody[1]//td/i/a")))])
        driver.close()
        driver.switch_to_window(parent_window)
    driver.quit()
    
    ['Tanhaji', 'Baaghi 3', 'Street Dancer 3D', 'Shubh Mangal Zyada Saavdhan', 'Malang', 'Chhapaak', 'Love Aaj Kal', 'Jawaani Jaaneman', 'Thappad', 'Panga']
    ['War', 'Saaho', 'Kabir Singh', 'Uri: The Surgical Strike', 'Bharat', 'Good Newwz', 'Mission Mangal', 'Housefull 4', 'Gully Boy', 'Dabangg 3']
    ['Sanju', 'Padmaavat', 'Andhadhun', 'Simmba', 'Thugs of Hindostan', 'Race 3', 'Baaghi 2', 'Hichki', 'Badhaai Ho', 'Pad Man']
    
    • 如何在webtable中打开多个hrefs
    • 在Python中使用Selenium WebScraping JavaScript呈现的内容
    • 在访问第一个元素--Webscraping Selenium Python之后,无法通过循环中的xpaths访问其余元素
    • 如何通过Python使用Selenium在新选项卡中打开网站中的每个产品

  •  类似资料:
    • 我正在尝试从这个维基百科页面中获取表数据:https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_Nepal我试过用熊猫警犬。Read Office HTML语法,但它对我试图擦除的表无效(证实了CavID-19在尼泊尔地区的病例)。 我试着用Beautifulsoup和pandas来搜集数据,但没有用

    • 问题内容: 例如,使用此Wikipedia转储: http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=lebron%20james&rvprop=content&redirects=true&format=xmlfm 我是否可以使用现有的Python库来创建带有主题和值映射的数组? 例如: 问题答案: 看来您确实

    • 我在selenium grid docker上工作来刮网站。如果我只使用一个chrome节点,则表示selenium网格正在工作,如果我缩放chrome selenium网格的一个以上节点,而scrapy再次停止工作。它只是闪烁一段时间后,与大的错误信息。 然后打开python shell并键入代码 正如您所看到的,它在WebDriver中停止。游标只是闪烁了很长一段时间,然后显示大的错误消息。我

    • 下面是我正在使用的代码,我以前使用过这个100x。现在它抛出了一个错误,基本上我正在尝试根据excel文件的第一行动态创建列。我现在收到的错误是: 我需要做些什么来防止这种情况发生,这种情况从未出现过。 以下是我的用法:

    • 维基百科离线阅读器,支持索引官方dump!

    • 我正在尝试使用POI Apache从Excel表中读取数据。我遇到的问题是,我想同时读取一行中所有单元格的数据,并将其存储在类类型的ArrayList中,但输出只是一个单元格接一个单元格。 下面是打开excel表并逐单元读取数据的类。 数据类