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

使用Beautiful Soup抓取网页表格遇<tr>未闭合问题求助

解决未闭合<tr>标签导致的表格数据抓取问题

嘿,我之前也碰到过这种不规范HTML的坑,太闹心了!针对你遇到的<tr>标签未闭合、数据没法拆分成行的问题,给你几个实用的解决思路:

1. 切换到更宽容的HTML解析器

Beautiful Soup默认的html.parser对不规范HTML的兼容性一般,换成html5lib就能自动修复未闭合的标签,它是基于HTML5规范的解析器,容错性很强。

首先先安装html5lib:

pip install html5lib

然后修改你的抓取代码,指定用这个解析器:

import requests
from bs4 import BeautifulSoup
import csv

url = "https://www.bseindia.com/corporates/shpSecurities.aspx?scripcd=500209&qtrid=96.00"
response = requests.get(url)
# 用html5lib解析,自动补全未闭合的标签
soup = BeautifulSoup(response.text, 'html5lib')

# 定位目标表格(你需要根据实际页面的表格id/class调整,比如找带特定样式的表格)
target_table = soup.find('table', {'class': 'some-table-class'})  # 替换成实际的表格标识

# 提取行并写入CSV
with open('shareholding_data.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    for row in target_table.find_all('tr'):
        # 提取每行的单元格文本
        cells = [cell.get_text(strip=True) for cell in row.find_all(['td', 'th'])]
        writer.writerow(cells)

2. 用Pandas直接读取表格(最省心的方案)

Pandas的read_html()方法内部会自动处理各种HTML不规范问题,而且能直接把表格转成DataFrame再导出CSV,几乎不用手动处理标签:

import pandas as pd

url = "https://www.bseindia.com/corporates/shpSecurities.aspx?scripcd=500209&qtrid=96.00"
# 读取网页中所有表格,返回DataFrame列表
tables = pd.read_html(url)
# 假设目标表格是第1个(你可以打印tables看每个表的内容,调整索引)
target_df = tables[0]
# 导出为CSV,去掉默认索引
target_df.to_csv('shareholding_data.csv', index=False, encoding='utf-8')

3. 手动拆分内容(极端情况备用)

如果上面两种方法都没效果,你可以先提取表格的纯文本,再根据内容的分隔特征手动拆分。比如假设单元格之间是多空格分隔,行之间有换行:

import requests
import csv
import re

url = "https://www.bseindia.com/corporates/shpSecurities.aspx?scripcd=500209&qtrid=96.00"
response = requests.get(url)

# 先定位表格的HTML片段(替换成实际表格的起始和结束标识)
start_idx = response.text.find('<table id="target-table-id">')
end_idx = response.text.find('</table>', start_idx)
table_html = response.text[start_idx:end_idx+8]

# 去掉所有HTML标签,得到纯文本
clean_text = re.sub('<[^<]+?>', '', table_html)
# 按换行拆分出行,过滤空行
raw_rows = [row.strip() for row in clean_text.split('\n') if row.strip()]

# 写入CSV,用多空格拆分单元格
with open('shareholding_data.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    for row in raw_rows:
        cells = re.split(r'\s{2,}', row)  # 两个及以上空格作为分隔符
        writer.writerow(cells)

优先试试前两种方法,大部分不规范HTML的问题都能解决。如果还是有问题,可以检查下目标表格是不是有嵌套的复杂结构,再调整定位逻辑。

内容的提问来源于stack exchange,提问作者Jitesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:10:56