爬取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
相关产品推荐
相关产品推荐

