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])
非常感谢
*此评论已被编辑,之前我说不是这样,但确实如此。
我正在尝试使用 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])
非常感谢
*此评论已被编辑,之前我说不是这样,但确实如此。