You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BeautifulSoup解析HTML时如何利用data-x-key避免重复调用find_next

BeautifulSoup 利用自定义属性解析表格优化方案

待解析HTML结构

目标表格行的有效字段td都自带data-x-key自定义属性,属性值和需要提取的字段名完全对应:

...   
    <tr class="main" data-year="Month">...</tr>
    <tr class="main" data-year="Month">...</tr>
    <tr class="main" data-year="Month">
      <td class="month" title="" data-x-key="name">June</td>
      <td class="month" title="" data-x-key="volume">100</td>
      <td class="month" title="" data-x-key="date">06/27/2022</td>
    </tr>
    ...
    <tr class="main" data-year="Month">...</tr>
...

原有代码问题

原有写法通过链式调用find_next按位置找td,冗余度高,一旦表格列顺序调整就会解析错误,遇到空tr还容易触发属性不存在的报错:

...
    soup = BeautifulSoup(html, 'html.parser')
    item = soup.find_all('tr', class_='main')
    data = []
    for i in item:     
        data.append({
                    'name': i.find('td', class_='month').get_text(),
                    'volume': i.find('td', class_='month').find_next('td', class_='month').get_text(),
                    'date': i.find('td', class_='month').find_next('td', class_='month').find_next('td', 
                            class_='month').get_text()
                    })
    print(data)    
...

优化实现

直接通过属性筛选匹配所有带data-x-key的td标签,自动将属性值作为字段名、标签文本作为字段值生成字典,不需要依赖标签位置:

soup = BeautifulSoup(html, 'html.parser')
tr_list = soup.find_all('tr', class_='main')
data = []
for tr in tr_list:
    row = {}
    # 筛选当前行下所有带data-x-key属性的月份td
    for td in tr.find_all('td', class_='month', attrs={'data-x-key': True}):
        row[td['data-x-key']] = td.get_text(strip=True)
    # 过滤无有效字段的空行
    if row:
        data.append(row)
print(data)

优化点说明

  • 代码无冗余链式调用,逻辑更简洁
  • 不依赖列的固定顺序,后续调整td排列位置不会影响解析结果
  • 自动兼容新增字段,只要td带data-x-key属性就会自动提取,不需要修改解析代码
  • 自动跳过空行,避免找不到标签触发的AttributeError

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:15:54