如何用BeautifulSoup提取HTML片段生成指定结构的自定义列表?
将BeautifulSoup提取的动态列表转换为固定结构列表
问题描述
现有三段HTML片段,通过以下代码提取内容:
from bs4 import BeautifulSoup soup = BeautifulSoup(html, "lxml") # 分别传入html_1、html_2、html_3 res = soup.find("span", class_="font-weight-bold") print(res.text.split())
得到的拆分结果为:
['issue_number', '4', 'Näköispainos', '6.12.1939'] # html_1 ['issue_number', '8', '1998'] # html_2 ['1905'] # html_3
需要将这些动态长度的列表转换为固定4元素结构,对应["issue_number", "number", "extension", "date"],缺失位置用None填充,期望输出:
['issue_number', '4', 'Näköispainos', '6.12.1939'] # html_1 ['issue_number', '8', None, '1998'] # html_2 [None, None, None, '1905'] # html_3
解决方案
通过对拆分后的列表进行特征匹配,填充到固定结构中,缺失项补None,代码实现如下:
from bs4 import BeautifulSoup def parse_issue_content(html): soup = BeautifulSoup(html, "lxml") target_span = soup.find("span", class_="font-weight-bold") # 初始化固定结构的结果列表,默认全为None result = [None, None, None, None] if not target_span: return result parts = target_span.text.split() # 处理包含issue_number的情况 if parts and parts[0] == "issue_number": result[0] = parts[0] # 填充number字段 if len(parts) >= 2: result[1] = parts[1] # 处理剩余元素 if len(parts) == 4: result[2] = parts[2] result[3] = parts[3] elif len(parts) == 3: # 此时第三个元素是date,extension留空 result[3] = parts[2] else: # 仅包含日期的情况 if len(parts) == 1: result[3] = parts[0] return result # 测试调用示例 # print(parse_issue_content(html_1)) # print(parse_issue_content(html_2)) # print(parse_issue_content(html_3))
逻辑说明
- 先创建一个全为
None的4元素列表,保证结构固定; - 检查是否找到目标span元素,未找到则直接返回全
None列表; - 拆分span文本内容后,判断是否以
issue_number开头:- 若是则依次填充
issue_number和number字段; - 根据元素总数判断剩余字段:长度为4时填充
extension和date,长度为3时仅填充date;
- 若是则依次填充
- 若不以
issue_number开头,且仅一个元素,则将其作为date填充到最后一位。
内容的提问来源于stack exchange,提问作者farid
相关产品推荐
相关产品推荐

