使用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
相关产品推荐
相关产品推荐

