使用Beautiful Soup爬取海啸数据时无法找到表格标签求助
提取NOAA海啸数据页面指定列的解决方案
这个页面是React动态渲染的,直接用requests获取的初始HTML里没有渲染后的表格内容,所以你的BeautifulSoup代码找不到目标元素。下面给两种可行的解决方法:
方法一:直接调用API接口(推荐,高效稳定)
这个页面的数据是通过后端API加载的,你可以直接请求API获取原始JSON数据,无需解析页面:
- 打开浏览器开发者工具(F12)→ 切换到「Network」标签 → 刷新页面,在XHR/fetch请求里能找到数据接口,地址为
https://www.ngdc.noaa.gov/hazel/rest/hazards/tsunami/events?maxYear=2022&minYear=2010&country=USA - 用Python请求该接口并提取字段:
import requests # 直接请求API接口 api_url = 'https://www.ngdc.noaa.gov/hazel/rest/hazards/tsunami/events?maxYear=2022&minYear=2010&country=USA' resp = requests.get(api_url) event_data = resp.json() # 提取所需的Year、月份日期、Hr、Mn、Sec字段 for event in event_data: print(f""" Year: {event.get('year')} Mom Dy: {event.get('month')}/{event.get('day')} Hr: {event.get('hour')} Mn: {event.get('minute')} Sec: {event.get('second')} ------------------------ """)
方法二:用Selenium渲染页面(适合动态渲染场景)
如果不想找API,可以用Selenium模拟浏览器加载页面,等React渲染完成后再提取元素:
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 url = 'https://www.ngdc.noaa.gov/hazel/view/hazards/tsunami/event-data?maxYear=2022&minYear=2010&country=USA' # 初始化Chrome浏览器(需提前安装ChromeDriver并配置环境变量) driver = webdriver.Chrome() driver.get(url) # 等待表格容器加载完成 wait = WebDriverWait(driver, 10) grid_container = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'ReactVirtualized__Grid__innerScrollContainer'))) # 遍历每行提取数据 rows = grid_container.find_elements(By.CLASS_NAME, 'ReactVirtualized__Table__row') for row in rows: cells = row.find_elements(By.CLASS_NAME, 'ReactVirtualized__Table__rowColumn') # 根据页面列顺序提取对应内容(索引可根据实际页面调整) year = cells[0].text mom_dy = cells[1].text hr = cells[2].text mn = cells[3].text sec = cells[4].text print(f"Year: {year}, Mom Dy: {mom_dy}, Hr: {hr}, Mn: {mn}, Sec: {sec}") driver.quit()
原代码无效的原因
你用requests.get获取的是页面初始的静态HTML,而表格内容是React在浏览器端动态渲染生成的,初始HTML里不存在ReactVirtualized__Grid__innerScrollContainer这类元素,所以BeautifulSoup无法找到。
内容的提问来源于stack exchange,提问作者oscarmarinoa
相关产品推荐
相关产品推荐

