从https://www.sbstransit.com.sg/fares-and-concessions提取单列数据失败求助
解决SBS Transit网站数据提取问题
问题分析
你的代码存在几个关键问题导致提取失败:
pd.read_html返回的是DataFrame列表,直接赋值给df后无法直接定位目标表格;- BeautifulSoup部分依赖了浏览器自动生成的
<tbody>标签(原始HTML中可能不存在),且使用.string提取文本容易失效(当<td>内包含子标签时); - 表格选择器
{'class': 'spad'}可能未匹配到目标表格,需要确认页面源码中的表格标识。
方案1:使用Pandas快速提取(推荐)
Pandas的read_html会自动解析页面所有表格,只需定位到目标表格后提取单列即可:
import pandas as pd # 获取页面所有表格,返回DataFrame列表 dfs = pd.read_html('https://www.sbstransit.com.sg/fares-and-concessions') # 先查看页面有多少个表格,确认目标表格的索引 print(f"页面表格总数:{len(dfs)}") # 逐个打印表格预览,找到你需要的目标表格(比如示例中假设是第1个表格,索引0) for idx, table in enumerate(dfs): print(f"\n=== 表格{idx}预览 ===") print(table.head()) # 提取目标表格的第一列数据(替换索引为你找到的目标表格序号) target_column = dfs[0].iloc[:, 0] print("\n提取的单列数据:") print(target_column)
方案2:使用BeautifulSoup精准提取
如果需要更灵活的控制,修正BeautifulSoup代码如下:
from urllib.request import urlopen from bs4 import BeautifulSoup # 解析页面 soup = BeautifulSoup(urlopen('https://www.sbstransit.com.sg/fares-and-concessions').read(), 'html.parser') # 获取所有表格,确认目标表格位置 tables = soup.find_all('table') print(f"页面表格总数:{len(tables)}") # 遍历目标表格的行(跳过空行和表头) # 这里假设目标是第一个表格,你可以根据实际情况调整索引 for row in tables[0].find_all('tr'): td_list = row.find_all('td') if td_list: # 确保当前行有数据单元格 # 使用get_text提取文本,自动处理子标签和空格 first_col_content = td_list[0].get_text(strip=True) print(first_col_content)
关键注意事项
- 不要依赖
<tbody>标签:多数网站的原始HTML中不会包含该标签,是浏览器渲染时自动添加的,直接通过<table>找<tr>即可; - 优先用
get_text(strip=True)替代.string:当<td>内有<span>、<strong>等子标签时,.string会返回None,而get_text能提取所有文本内容; - 确认表格选择器:如果目标表格有唯一的class或id,直接用
soup.find('table', {'class': '目标类名'})定位会更精准。
内容的提问来源于stack exchange,提问作者mobly elliot
相关产品推荐
相关产品推荐

