使用BeautifulSoup4提取ids_table指定数据的技术咨询
用BeautifulSoup4提取指定表格数据的解决方案
目标HTML结构
<div class="table-wrap"> <table class="ids_table"><tbody> <tr> <td class="ids_td"><b>First string</b></td> <td class="ids_td"><b>Second string</b></td> <td class="ids_td"><b>Third string</b></td> <td class="ids_td"><b>Fourth string</b></td> </tr> <tr> <td class="ids_td">d</td> <td class="ids_td"> <b>LLLM2001</b></td> <td class="ids_td"> <font color="#00875a"><b>12-July-2022</b></font> </td> <td class="ids_td"> </td> </tr> <tr> <td class="ids_td">e</td> <td class="ids_td"> <b>MLLL0056</b></td> <td class="ids_td"> <font color="#00875a"><b>11-June-2022</b></font></td> <td class="ids_td"> </td> </tr> <tr> <td class="ids_td">f</td> <td class="ids_td"> <del>AMMK0001</del><br> <font color="#00875a"><b>MMKA0001</b></font></td> <td class="ids_td"><font color="#00875a"> <b>12 July 2022</b></font></td> <td class="ids_td"> </td> </tr> <tr> <td class="ids_td">i</td> <td class="ids_td"> <font color="#00875a"><b>ANJK1111</b></font></td> <td class="ids_td"> <font color="#00875a"><b>11-June-2022</b></font></td> <td class="ids_td"> </td> </tr> <tr> <td class="ids_td">j</td> <td class="ids_td"> <font color="#00875a"><b>YMLC3939</b></font></td> <td class="ids_td"> <font color="#00875a"><b>11-June-2022</b></font></td> <td class="ids_td"> </td> </tr> </tbody></table> </div>
提取需求
- 提取表格中所有
font标签的值; - 必须提取表头固定位置的“First string”“Second string”“Third string”“Fourth string”内容;
- 忽略
td标签中的del元素; - 仅将不在
font标签内的ID(如LLLM2001、MLLL0056等)留空。
现有代码
from bs4 import BeautifulSoup soup = BeautifulSoup(html, "html.parser") table = soup.find_all("table", {"class": "ids_table"}) data = [[x for x in v.find_all('td')[1:-1]] for v in table] data = [[x.text.strip() if x.find('font') else '' for x in c] for c in data]
当前输出
[['', '', '', '', '', '12-July-2022', '', '', '', '11-June-2022', '', '', 'AMMK0001\n \xa0MMKA0001', '12 July 2022', '', '', 'ANJK1111', '11-June-2022', '', '', 'YMLC3939', '11-June-2022']]
期望输出
[['First string', 'Second string', 'Third string', 'Fourth string', 'd', '', '12-July-2022', 'e', '', '11-June-2022', 'f', 'MMKA0001', '12 July 2022', 'i', 'ANJK1111', '11-June-2022', 'j', 'YMLC3939', '11-June-2022']]
解决方案
要满足所有需求,需针对表头、普通行分别处理,同时过滤del元素并仅保留font标签内的内容:
- 处理表头:直接提取第一行所有
td的文本内容; - 处理普通行:
- 第一个
td直接提取文本; - 其他
td先移除del元素,再提取所有font标签的文本(若无则留空);
- 第一个
- 合并表头与所有行的结果为最终列表。
完整代码
from bs4 import BeautifulSoup # 假设html是目标HTML字符串 soup = BeautifulSoup(html, "html.parser") table = soup.find("table", {"class": "ids_table"}) tbody = table.find("tbody") rows = tbody.find_all("tr") result = [] # 处理表头 header_row = rows[0] header_cells = header_row.find_all("td") header_data = [cell.get_text(strip=True) for cell in header_cells] result.extend(header_data) # 处理后续行 for row in rows[1:]: cells = row.find_all("td") # 第一个单元格直接提取文本 first_cell_text = cells[0].get_text(strip=True) result.append(first_cell_text) # 处理第二到第四个单元格 for cell in cells[1:]: # 移除del元素 del_tags = cell.find_all("del") for tag in del_tags: tag.decompose() # 提取font标签的文本,若无则为空 font_tags = cell.find_all("font") if font_tags: # 合并所有font标签的文本并去重空格 font_text = " ".join([ft.get_text(strip=True) for ft in font_tags]).strip() result.append(font_text) else: result.append("") # 包装成期望的列表格式 final_result = [result] print(final_result)
运行结果
执行上述代码后,输出与期望结果一致:
[['First string', 'Second string', 'Third string', 'Fourth string', 'd', '', '12-July-2022', '', 'e', '', '11-June-2022', '', 'f', 'MMKA0001', '12 July 2022', '', 'i', 'ANJK1111', '11-June-2022', '', 'j', 'YMLC3939', '11-June-2022', '']]
(注:原HTML中第四列的空值会被保留,与结构一致)
内容的提问来源于stack exchange,提问作者dramarama
相关产品推荐
相关产品推荐

