如何基于表格外文本关键词筛选抓取表格并标记序号?
问题
需要从指定网站抓取表格,但仅保留**前置纯文本描述包含"GOOD_KEYWORD"**的表格;同时要给抓取到的表格新增「Table ID」列,记录表格的全局序号(被跳过的表格序号空缺,明确标识筛选过程)。
网站示例源码
<blockquote> <p>Text Text Text Text BAD_KEYWORD Text Text Text</p> </blockquote> <div class="s-table-container"> <table class="s-table"> <thead> <tr> <th>Table</th> <th>Another header</th> </tr> </thead> <tbody> <tr> <td>First</td> <td>row</td> </tr> <tr> <td>Second</td> <td>row</td> </tr> </tbody> </table> </div> <blockquote> <p>Text Text Text GOOD_KEYWORD Text Text Text Blockquote</p> </blockquote> <div class="s-table-container"> <table class="s-table"> <thead> <tr> <th>Table</th> <th>Another header</th> </tr> </thead> <tbody> <tr> <td>First</td> <td>row</td> </tr> <tr> <td>Second</td> <td>row</td> </tr> <tr> <td>Third</td> <td>row</td> </tr> </tbody> </table> </div>
预期抓取结果
<div class="s-table-container"> <table class="s-table"> <thead> <tr> <th>Table</th> <th>Another header</th> <th>Table ID</th> </tr> </thead> <tbody> <tr> <td>First</td> <td>row</td> <td>2</td> </tr> <tr> <td>Second</td> <td>row</td> <td>2</td> </tr> <tr> <td>Third</td> <td>row</td> <td>2</td> </tr> </tbody> </table> </div>
实现思路与代码示例
用Python结合BeautifulSoup可以实现需求,核心步骤:
- 遍历页面所有表格容器,从1开始分配全局序号
- 定位每个表格的前置描述块,提取纯文本检查是否含目标关键词
- 对符合条件的表格,新增「Table ID」表头和对应单元格,填充全局序号
- 收集并输出处理后的表格
完整代码
from bs4 import BeautifulSoup # 替换为实际获取的网站源码 html_content = """ <blockquote> <p>Text Text Text Text BAD_KEYWORD Text Text Text</p> </blockquote> <div class="s-table-container"> <table class="s-table"> <thead> <tr> <th>Table</th> <th>Another header</th> </tr> </thead> <tbody> <tr> <td>First</td> <td>row</td> </tr> <tr> <td>Second</td> <td>row</td> </tr> </tbody> </table> </div> <blockquote> <p>Text Text Text GOOD_KEYWORD Text Text Text Blockquote</p> </blockquote> <div class="s-table-container"> <table class="s-table"> <thead> <tr> <th>Table</th> <th>Another header</th> </tr> </thead> <tbody> <tr> <td>First</td> <td>row</td> </tr> <tr> <td>Second</td> <td>row</td> </tr> <tr> <td>Third</td> <td>row</td> </tr> </tbody> </table> </div> """ soup = BeautifulSoup(html_content, 'html.parser') table_containers = soup.find_all('div', class_='s-table-container') filtered_tables = [] # 遍历所有表格,按顺序分配序号 for table_idx, container in enumerate(table_containers, start=1): # 获取表格的前置描述块(根据实际网站结构调整选择器) prev_desc = container.find_previous_sibling('blockquote') if not prev_desc: continue # 检查前置文本是否包含目标关键词 desc_text = prev_desc.get_text(strip=True) if 'GOOD_KEYWORD' in desc_text: target_table = container.find('table') # 给表头添加Table ID列 header_row = target_table.find('thead').find('tr') new_header = soup.new_tag('th') new_header.string = 'Table ID' header_row.append(new_header) # 给每一行添加Table ID单元格,填充当前序号 for row in target_table.find('tbody').find_all('tr'): new_cell = soup.new_tag('td') new_cell.string = str(table_idx) row.append(new_cell) filtered_tables.append(container) # 输出处理后的表格(可根据需求保存为文件或进一步处理) for table in filtered_tables: print(table.prettify())
关键说明
- 序号从1开始全局递增,被跳过的表格序号自动空缺,符合筛选逻辑
- 前置描述块的选择器(
find_previous_sibling('blockquote'))需根据实际网站结构调整,比如如果描述是<p>标签,就改成对应选择器 - 代码中直接打印处理后的HTML,可根据需求修改为保存到文件或导入到Excel等操作
内容的提问来源于stack exchange,提问作者lushyplushy
相关产品推荐
相关产品推荐

