如何用Beautiful Soup解析HTML提取文件、函数及STCYC值?
解决HTML解析中关联文件、函数与指标值的问题
你当前的代码只是遍历所有<h3>、<h4>和<table>元素,但没有将它们按上下文关联起来——毕竟每个文件(<h3>)对应关联函数(<h4>),再对应后面的指标表格,是一组一组的结构,不能单独提取零散元素。
下面是针对这种不规范HTML的解析方案,核心是利用元素的顺序关系来关联对应内容:
实现步骤
- 遍历所有
<h3>元素(每个对应一个文件); - 对每个
<h3>,找到它之后的第一个<h4>(关联函数); - 接着找到该
<h4>之后的第一个class="metricstable"的表格; - 从表格中提取
STCYC对应的指标值; - 将三者组装成目标数据结构。
代码示例
from bs4 import BeautifulSoup # 假设你的HTML内容存在html_content变量中 soup = BeautifulSoup(html_content, 'html.parser') result = [] # 遍历所有h3(文件路径) for h3 in soup.find_all('h3'): file_path = h3.get_text(strip=True) # 提取文件名(如果需要从路径中截取最后一段) file_name = file_path.split('/')[-1] # 找当前h3之后的第一个h4(关联函数) h4 = h3.find_next('h4') if not h4: continue # 没有对应函数则跳过 func_name = h4.get_text(strip=True) # 找当前h4之后的第一个metricstable表格 table = h4.find_next('table', class_='metricstable') if not table: continue # 没有对应表格则跳过 # 遍历表格行,提取STCYC值 stcyc_value = None for row in table.find_all('tr'): cells = row.find_all('td') # 假设第一列是指标名称,第二列是值(根据实际表格结构调整) if len(cells) >= 2 and cells[0].get_text(strip=True) == 'STCYC': stcyc_value = cells[1].get_text(strip=True) break if stcyc_value: result.append({ '文件名': file_name, '关联函数': func_name, 'STCYC值': stcyc_value }) # 输出结果 for item in result: print(item)
注意事项
- 如果HTML结构更混乱(比如一个
<h3>下有多个<h4>和对应表格),可以调整逻辑:遍历<h4>时,用h3.find_next_siblings('h4')获取该文件下的所有关联函数,再逐个找对应表格; - 表格的结构可能不同,需要根据实际HTML里的
<tr>、<td>或<th>结构调整提取逻辑; - 使用
get_text(strip=True)可以去除文本中的多余空格和换行符,让内容更干净。
内容的提问来源于stack exchange,提问作者ValeTrut
相关产品推荐
相关产品推荐

