使用Python和BeautifulSoup抓取政府网站表格遇问题求助
魁北克INSPQ COVID-19时间线表格抓取修正方案
环境准备(Colab执行)
先安装所需依赖库:
!pip install requests beautifulsoup4 pandas # 若页面为JS动态加载,额外执行以下命令 # !pip install selenium # !apt-get update # !apt-get install chromium-chromedriver
完整可运行代码
静态页面抓取(优先尝试)
import requests from bs4 import BeautifulSoup import pandas as pd # 目标页面URL url = "https://www.inspq.qc.ca/covid-19/chronologie" # 获取页面并解析 response = requests.get(url) response.encoding = 'utf-8' soup = BeautifulSoup(response.text, 'html.parser') # 定位时间线表格(基于页面当前class定位,若页面更新需调整) table = soup.find('table', class_='tableau-chronologie') # 提取表格数据 data = [] for row in table.find_all('tr')[1:]: # 跳过表头行 cols = row.find_all('td') if len(cols) >= 3: date = cols[0].get_text(strip=True) event_type = cols[1].get_text(strip=True) measure = cols[2].get_text('\n', strip=True) # 保留措施内的换行结构 data.append([date, event_type, measure]) # 转换为DataFrame并导出CSV df = pd.DataFrame(data, columns=['日期', '事件类型', '采取的措施']) df.to_csv('魁北克COVID19时间线.csv', index=False, encoding='utf-8-sig') # 预览数据 print(df.head())
动态页面兼容方案(若静态抓取失败)
如果页面通过JavaScript渲染表格,使用Selenium获取完整页面内容:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup import pandas as pd url = "https://www.inspq.qc.ca/covid-19/chronologie" # Colab Chrome无头模式配置 options = Options() options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome('chromedriver', options=options) driver.get(url) soup = BeautifulSoup(driver.page_source, 'html.parser') driver.quit() # 后续数据提取、导出步骤与静态方案完全一致 table = soup.find('table', class_='tableau-chronologie') data = [] for row in table.find_all('tr')[1:]: cols = row.find_all('td') if len(cols) >= 3: date = cols[0].get_text(strip=True) event_type = cols[1].get_text(strip=True) measure = cols[2].get_text('\n', strip=True) data.append([date, event_type, measure]) df = pd.DataFrame(data, columns=['日期', '事件类型', '采取的措施']) df.to_csv('魁北克COVID19时间线.csv', index=False, encoding='utf-8-sig') print(df.head())
关键注意事项
- 表格定位调整:若INSPQ页面更新了表格的class/id,右键检查页面元素,找到表格的正确标识,替换代码中
find('table', class_='tableau-chronologie')的参数。 - 编码处理:导出CSV时使用
utf-8-sig编码,避免Excel打开出现乱码。 - Colab文件查看:导出的CSV文件可在Colab左侧"文件"面板中找到,点击即可下载。
内容的提问来源于stack exchange,提问作者Tiziano Siri
相关产品推荐
相关产品推荐

