Selenium returns 一个空字符串爬取一个特定的域

Selenium returns an empty string crawling one specific domain

我正在尝试使用 selenium 和 python 自动化关键字跟踪。我正在使用一个名为“我从中搜索”的在线工具来获取结果页面,然后尝试抓取它们以获取我的域的当前位置。我正在使用的代码在其他域中工作正常,它 returns 一个对象列表。我不明白为什么会出现问题,也许我没有正确定位某个元素,但我自己找不到解决方案。如果有任何提示可以促使我找到解决方案,我将不胜感激。我尝试了所有可能的方法来通过 id、xpath 或 class 名称定位元素,但没有任何效果。

此致!

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.select import Select
    import time
    
    driver = webdriver.Firefox(executable_path="C:\Drivers\geckodriver.exe")
    
    keywords = ['random keyword']
    
    driver.get("https://www.google.com")
    
    newGoogleCookie = {'name': 'CONSENT', 'value': 'YES+PL.pl+V12+B', 'path': '/', 'domain': '.google.com', 'secure': False, 'httpOnly': False, 'expiry': 2145916800, 'sameSite': 'None'}
    driver.add_cookie(newGoogleCookie)
    
    driver.get('https://www.isearchfrom.com')
    
    CountryInput = driver.find_element_by_id('countrytags')
    LanguageInput = driver.find_element_by_id('languagetags')
    deviceDropdown = driver.find_element_by_id('deviceselect')
    
    CountryInput.send_keys("Poland")
    LanguageInput.send_keys("Polish")
    deviceDropdown.send_keys('Android phone')
    
    searchedKeywordInput = driver.find_element_by_id('searchinput')
    for keyword in keywords:
        searchedKeywordInput.send_keys(keyword)
        SearchButton = driver.find_element_by_id('searchbutton').click()
        results = driver.find_elements_by_xpath('//*[@id="dimg_1"]')
        print(results)

您正在使用的定位器 //*[@id="dimg_1"] 适用于搜索结果中的图像。这可能不适用于所有搜索结果。当您搜索“随机关键字”时,搜索结果没有任何图像,因此列表 results 的长度为 0。

您需要将定位器修改为更通用的定位器,即使搜索结果没有任何图像也能正常工作。也许你可以使用这样的东西://div[@class="kCrYT"]/a/h3/div。这将为您提供搜索结果的所有 webElements headers

更新: 这种情况下的问题是您没有切换到打开的新 window/tab。请尝试使用以下代码:

driver.get('http://www.isearchfrom.com')

CountryInput = driver.find_element_by_id('countrytags')
LanguageInput = driver.find_element_by_id('languagetags')
deviceDropdown = driver.find_element_by_id('deviceselect')

CountryInput.send_keys("Poland")
LanguageInput.send_keys("Polish")
deviceDropdown.send_keys('Android phone')

searchedKeywordInput = driver.find_element_by_id('searchinput')
parentGUID = driver.window_handles[0]
for keyword in keywords:
    searchedKeywordInput.send_keys(keyword)
    SearchButton = driver.find_element_by_id('searchbutton').click()
    window_after=driver.window_handles[1]
    driver.switch_to_window(window_after)
    results = driver.find_elements_by_xpath('//div[@class="kCrYT"]/a/h3/div')
    print(len(results))
    print(results)

看来你是对的。我一直在抓取第一个打开的标签。 我通过将此行添加到应该 运行 抓取每个结果的循环来修复它:driver.switch_to.window(driver.window_handles[-1])

非常感谢

*此评论已被编辑,之前我说不是这样,但确实如此。