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
相关产品推荐
相关产品推荐

