You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:09:01