网页抓取Citibike数据时无法获取<tr>标签内容求助
解决Citibike骑行数据抓取中标签无法获取的问题
问题描述
尝试用Python抓取Citibike骑行数据文件时,能成功定位到id="tbody-content"的<tbody>标签,但调用.find_all('tr')返回空列表,无法获取<td>内<a>标签的链接和文本。代码如下:
url = 'https://s3.amazonaws.com/tripdata/index.html' html_source = requests.get(url).text soup = BeautifulSoup(html_source, "html.parser") soup.prettify() # 仅获取tbody标签能成功,但添加.find_all('tr')后返回空 citibikedata = soup.find('tbody', id = "tbody-content").find_all('tr') print(citibikedata)
问题原因
requests获取的是页面的静态HTML源码,而目标页面中#tbody-content内的<tr>标签是通过JavaScript动态渲染生成的,静态源码中不存在这些标签,因此BeautifulSoup无法解析到。
解决方案
方案一:用Selenium模拟浏览器加载动态页面
通过模拟浏览器运行JavaScript,获取完全加载后的页面内容:
from selenium import webdriver from bs4 import BeautifulSoup import time url = 'https://s3.amazonaws.com/tripdata/index.html' # 初始化Chrome浏览器(需提前安装对应版本的chromedriver) driver = webdriver.Chrome() driver.get(url) # 等待页面动态内容加载完成 time.sleep(2) # 获取加载后的完整页面源码 html_source = driver.page_source soup = BeautifulSoup(html_source, "html.parser") # 正常提取<tr>标签 citibikedata = soup.find('tbody', id="tbody-content").find_all('tr') # 遍历提取每个文件的链接和名称 for tr in citibikedata: a_tag = tr.find('td').find('a') if a_tag: file_link = a_tag['href'] file_name = a_tag.get_text(strip=True) print(f"文件名称:{file_name}\n下载链接:{file_link}\n") # 关闭浏览器 driver.quit()
方案二:直接访问S3存储桶获取文件列表(更高效)
Citibike的骑行数据直接存储在AWS S3的tripdata存储桶中,可直接请求存储桶的文件列表页面,无需依赖动态渲染:
import requests from bs4 import BeautifulSoup # 直接访问S3存储桶的文件列表地址 url = 'https://s3.amazonaws.com/tripdata/' response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # 提取所有数据文件的链接和名称 for link in soup.find_all('a'): file_href = link['href'] # 过滤出骑行数据文件(csv/zip格式) if file_href.endswith(('.csv', '.zip')): full_link = f"https://s3.amazonaws.com/tripdata/{file_href}" print(f"文件名称:{file_href}\n下载链接:{full_link}\n")
方案二无需等待页面加载,执行效率更高,推荐优先使用。
内容的提问来源于stack exchange,提问作者AyG
相关产品推荐
相关产品推荐

