使用Selenium抓取汽车博客时无法遍历含p标签的div标签如何解决
代码问题及修复说明
- 类名选择器使用错误:
By.CLASS_NAME不支持传入带空格的多类名,field-item even是两个独立的类,需改用CSS选择器或XPATH定位。 - 缩进逻辑错误:文章点击、内容抓取的逻辑没有写在遍历文章的for循环内部,只会执行1次,无法遍历多篇文章。
- p标签抓取逻辑错误:
find_element_by_tag_name('p')只会返回第一个匹配的p标签,要获取多个p标签需用复数形式的find_elements方法,原有嵌套循环逻辑冗余且只能拿到最后一段内容。 - 页面回退后缺少等待:调用
driver.back()回到列表页后,没有等待列表元素加载完成,下一轮循环会出现元素找不到的报错。 - 旧版Selenium语法弃用:
find_element_by_*系列方法在Selenium 4.0+版本已被移除,建议统一使用find_element(By.XXX, 定位值)的标准写法。
修正后完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 可根据自己的浏览器类型调整驱动初始化逻辑 driver = webdriver.Chrome() driver.get("https://www.autocar.co.uk/car-news") driver.maximize_window() for i in range(3): # 等待当前列表项加载完成 info = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, f'//*[@id="page"]/div[2]/div[1]/div[1]/div[2]/div/div[1]/div/div[1]/div[1]/div[{i+1}]/div')) ) # 提前存储标题,跳转详情页后无法再从当前列表元素获取标题 heading = info.find_element(By.TAG_NAME, 'h2') heading_text = heading.text clickable = heading.find_element(By.TAG_NAME, 'a') driver.execute_script("arguments[0].click();", clickable) try: # 改用CSS选择器定位多类名元素,类名前加. 空格分隔多个类 body_info = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, '.field-item.even')) ) # 直接获取目标div下所有p标签 p_tags = body_info.find_elements(By.TAG_NAME, 'p') main_text = [] # 取前3段内容,和原有需求对齐 for p in p_tags[:3]: main_text.append(p.text) print(f'标题:{heading_text}\n内容:{"\n".join(main_text)}\n{"-"*50}') except: print(f"{heading_text} 抓取失败:couldn't find tag") finally: # 无论抓取是否成功都返回列表页 driver.back() # 等待列表页加载完成,避免下一轮循环找不到元素 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'page')) ) driver.quit()
内容的提问来源于stack exchange,提问作者closet_nerdd
相关产品推荐
相关产品推荐

