You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从https://www.sbstransit.com.sg/fares-and-concessions提取单列数据失败求助

解决SBS Transit网站数据提取问题

问题分析

你的代码存在几个关键问题导致提取失败:

  1. pd.read_html 返回的是DataFrame列表,直接赋值给df后无法直接定位目标表格;
  2. BeautifulSoup部分依赖了浏览器自动生成的<tbody>标签(原始HTML中可能不存在),且使用.string提取文本容易失效(当<td>内包含子标签时);
  3. 表格选择器{'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:40:31