Selenium捕获NoSuchElementException后跳转下URL抓取最多5条结果问题
问题原因
你代码的核心逻辑错误是:每次捕获NoSuchElementException后直接调用了continue,这会直接终止当前URL的所有剩余处理步骤,直接跳转至下一个URL,自然无法完成剩余结果位补None的操作。同时你当前的页面等待逻辑是等待第2条结果对应的元素渲染,若某URL结果不足2条,会直接在等待阶段超时抛出异常,后续逻辑完全无法执行。
修改方案
调整等待逻辑,只需要根节点加载完成即可;同时将异常捕获后的continue替换为补全剩余None后再终止当前URL的处理,修改后代码如下:
from selenium.common.exceptions import NoSuchElementException group_url = [ 'https://www.example1.com', 'https://www.example2.com', 'https://www.example3.com' ] data = [] for group in group_url: driver.get(group) wait = WebDriverWait(driver, 90) # 修改等待逻辑,只要根节点加载完成即可,不要等第2条结果 element = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="root"]'))) # 标记当前抓取到第几条 current_idx = 0 try: kw1 = driver.find_element_by_xpath('//*[@id="root"]/div') vol1 = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]') url1 = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/main/') data.append({ "Result 1": (kw1.text, vol1.text, url1.text) }) current_idx = 1 except NoSuchElementException: data.append({"Result 1": None}) current_idx = 0 # 第一条抓取失败,直接补剩下4个None if current_idx == 0: for i in range(2,6): data.append({f"Result {i}": None}) continue try: kw2 = driver.find_element_by_xpath('//*[@id="root"]/div') vol2 = driver.find_element_by_xpath('//*[@id="root"]/div/div[2]') url2 = driver.find_element_by_xpath('//*[@id="root"]/div/div[2]/main/') data.append({ "Result 2": (kw2.text, vol2.text, url2.text) }) current_idx = 2 except NoSuchElementException: data.append({"Result 2": None}) current_idx = 1 # 第二条抓取失败,补剩下3个None if current_idx == 1: for i in range(3,6): data.append({f"Result {i}": None}) continue try: kw3 = driver.find_element_by_xpath('//*[@id="root"]/div') vol3 = driver.find_element_by_xpath('//*[@id="root"]/div/div[3]') url3 = driver.find_element_by_xpath('//*[@id="root"]/div/div[3]/main/') data.append({ "Result 3": (kw3.text, vol3.text, url3.text) }) current_idx = 3 except NoSuchElementException: data.append({"Result 3": None}) current_idx = 2 if current_idx == 2: for i in range(4,6): data.append({f"Result {i}": None}) continue try: kw4 = driver.find_element_by_xpath('//*[@id="root"]/div') vol4 = driver.find_element_by_xpath('//*[@id="root"]/div/div[4]') url4 = driver.find_element_by_xpath('//*[@id="root"]/div/div[4]/main/') data.append({ "Result 4": (kw4.text, vol4.text, url4.text) }) current_idx =4 except NoSuchElementException: data.append({"Result 4": None}) current_idx =3 if current_idx ==3: data.append({"Result 5": None}) continue try: kw5 = driver.find_element_by_xpath('//*[@id="root"]/div') vol5 = driver.find_element_by_xpath('//*[@id="root"]/div/div[5]') url5 = driver.find_element_by_xpath('//*[@id="root"]/div/div[5]/main/') data.append({ "Result 5": (kw5.text, vol5.text, url5.text) }) except NoSuchElementException: data.append({"Result 5": None}) driver.close() print(data)
修改说明
- 调整了页面等待规则,仅等待根节点
//*[@id="root"]渲染完成,避免结果不足2条的页面直接在等待阶段超时 - 新增了当前抓取进度标记
current_idx,一旦某条结果抓取失败,会自动补全后续所有不足5条的None值,再跳转至下一个URL - 保留了你要求的单条XPath定位元素的逻辑,没有修改抓取规则
内容的提问来源于stack exchange,提问作者VRapport
相关产品推荐
相关产品推荐

