使用Selenium无法定位TripAdvisor搜索框元素的问题求助
问题:Selenium无法定位TripAdvisor搜索框
我是Selenium新手,正在开发TripAdvisor评论爬取工具,在搜索框输入文本时始终失败。
目标页面:https://www.tripadvisor.co.uk/
HTML截图:HTML截图
尝试通过class name定位元素时,出现NoSuchElementException错误,报错信息如下:
Traceback (most recent call last): File "C:\Users\raefm\AppData\Roaming\JetBrains\PyCharmCE2021.1\scratches\scraper.py", line 16, in <module> search = driver.find_element("class name", "qjfqs _G B- z _J Cj R0") File "C:\Users\raefm\PycharmProjects\scraper\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 740, in find_element return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"] File "C:\Users\raefm\PycharmProjects\scraper\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 346, in execute self.error_handler.check_response(response) File "C:\Users\raefm\PycharmProjects\scraper\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 245, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".qjfqs _G B- z _J Cj R0"} (Session info: chrome=114.0.5735.199); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
当前代码:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.keys import Keys from webdriver_manager.chrome import ChromeDriverManager import time driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get("https://www.tripadvisor.co.uk") accept = driver.find_element("id", "onetrust-accept-btn-handler") accept.click() search = driver.find_element("class name", "qjfqs _G B- z _J Cj R0") search.send_keys("xyz") search.send_keys(Keys.RETURN) time.sleep(100)
解决建议
核心问题:Class Name定位不支持多类名
Selenium的class name定位只能传入单个类名,你写的qjfqs _G B- z _J Cj R0是多个类名组合,会被解析成无效的CSS选择器(报错里的.qjfqs _G B- z _J Cj R0不符合语法),自然找不到元素。替换成可靠的定位方式
推荐用以下几种方式定位搜索框:- 单个核心类名的CSS选择器:
用搜索框的核心类qjfqs直接定位:search = driver.find_element(By.CSS_SELECTOR, ".qjfqs") - 结合属性的CSS选择器:
如果类名不稳定,可结合搜索框的placeholder属性(比如实际页面中可能是"Search"):search = driver.find_element(By.CSS_SELECTOR, 'input[placeholder="Search"]') - ID定位(如果有):
若搜索框有唯一ID,用ID定位是最稳定的方式。
- 单个核心类名的CSS选择器:
添加显式等待解决加载延迟
页面加载速度可能慢于代码执行速度,用显式等待代替time.sleep,能确保元素加载完成后再执行操作:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待同意按钮可点击并点击 accept = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "onetrust-accept-btn-handler")) ) accept.click() # 等待搜索框出现并输入内容 search = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".qjfqs")) )
- 完整修正后的代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get("https://www.tripadvisor.co.uk") # 处理Cookie同意弹窗 accept = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "onetrust-accept-btn-handler")) ) accept.click() # 定位搜索框并输入内容 search = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".qjfqs")) ) search.send_keys("xyz") search.send_keys(Keys.RETURN) driver.quit()
内容的提问来源于stack exchange,提问作者raefmac
相关产品推荐
相关产品推荐

