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

爬取Verra注册网站时apx_root标签为空的问题解决咨询

解决apx-root标签为空的爬取问题

嘿,我来帮你搞定这个问题!你遇到的apx-root标签为空的情况,本质是因为这个网站是动态渲染的单页应用(SPA),用requests直接请求只能拿到最基础的静态HTML骨架,页面内容还没被JavaScript加载填充,所以apx-root里是空的。

问题根源

requests库只会发送HTTP请求获取服务器返回的初始HTML,不会执行页面里的JavaScript代码。而Verra的这个项目详情页是用React类框架构建的,所有实际内容都是浏览器加载JS后动态渲染到apx-root里的,静态请求自然拿不到这些内容。

解决方案:用Selenium模拟浏览器渲染

我们可以用selenium工具模拟真实浏览器的行为,它会自动执行页面的JavaScript,等内容渲染完成后再获取完整的页面源码。

步骤1:安装依赖

先安装selenium和对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配):

pip install selenium

步骤2:修改你的代码

下面是调整后的代码,用Chrome浏览器(也可以换成Firefox等)获取渲染后的页面:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 配置Chrome选项,可选无头模式(不弹出浏览器窗口)
chrome_options = Options()
chrome_options.add_argument('--headless=new')
chrome_options.add_argument('--disable-gpu')

# 初始化浏览器驱动
driver = webdriver.Chrome(options=chrome_options)

try:
    # 访问目标页面
    driver.get('https://registry.verra.org/app/projectDetail/VCS/3651')
    
    # 用显式等待替代固定sleep,等待页面关键元素加载完成(更可靠)
    WebDriverWait(driver, 15).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'card-header'))
    )
    
    # 获取完整的渲染后页面源码
    source = driver.page_source
    soup = BeautifulSoup(source, 'lxml')
    
    # 现在你可以正常获取apx-root里的内容了
    apx_root = soup.find('apx-root')
    print("填充后的apx-root标签:", apx_root)
    
    # 继续提取你需要的项目信息
    info_gathered = {'Heading': [], 'ID': [], 'Category': [], 'Proponent': [], 'Project Status': [], 'EAER': [], 'Project Type': [], 'Methodology': [], 'Project Validator': [], 'CPT': [], 'File_link': []}
    
    # 遍历卡片提取信息(修正你原代码里的错误写法)
    for card in soup.find_all('div', class_='card'):
        header = card.find('div', class_='card-header bg-primary')
        if header:
            headline = header.get_text(strip=True)
            print("卡片标题:", headline)
            # 这里可以根据标题对应填充info_gathered的字段
            # 比如如果是"Project ID",就提取对应的内容
            content = card.find('div', class_='card-body').get_text(strip=True)
            print("卡片内容:", content)
            
finally:
    # 一定要关闭浏览器,避免资源占用
    driver.quit()

额外提示

  • 你原代码里div['card-header bg-primary']是错误的写法,这是试图获取标签的属性值,但card-header bg-primary是class属性的内容,应该用find方法结合class_参数来查找元素。
  • 显式等待(WebDriverWait)比固定time.sleep()更灵活可靠,它会等到目标元素出现再继续执行,不用瞎等固定时长。

内容的提问来源于stack exchange,提问作者user15143876

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:12:30