如何用Python抓取HTML表格指定行数数据(模拟IMPORTHTML)
问题解决:Python模拟Google Sheets IMPORTHTML抓取冲浪数据
原代码问题分析
- CSS选择器错误:多个类名选择时,类名之间需要用
.连接,原代码用空格会被解析为后代选择器,无法定位到目标表格。 - 未指定HTML解析器:
BeautifulSoup(html)未指定解析器,可能导致解析异常。 - 缺少请求头:直接用
requests.get可能被网站反爬机制拦截,返回空内容。
修正后的代码
import requests from bs4 import BeautifulSoup # 添加请求头模拟浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } url = "https://magicseaweed.com/Belmar-Surf-Report/3683/" response = requests.get(url, headers=headers) response.raise_for_status() # 捕获请求错误 # 指定html.parser解析器 soup = BeautifulSoup(response.text, features="html.parser") # 修正CSS选择器:类名用.连接 table = soup.select_one("table.table-primary.table-forecast.allSwellsActive.msw-js-table") if table: # 获取前8行数据 for row in table.find_all("tr")[:8]: # 提取每个td的文本内容,过滤空字符 row_data = [td.get_text(strip=True) for td in row.find_all("td")] print(row_data) else: print("未找到目标表格")
关键修复点
- CSS选择器修正:将
table table-primary...改为table.table-primary...,定位同时包含这些类的表格元素。 - 添加请求头:模拟浏览器UA,避免被反爬拦截。
- 指定解析器:明确使用
html.parser,提升解析稳定性。 - 错误处理:增加
response.raise_for_status()捕获请求异常,避免空内容导致后续报错。 - 文本提取:将td对象转换为实际文本内容,方便后续处理。
内容的提问来源于stack exchange,提问作者Anthony Madle
相关产品推荐
相关产品推荐

