HTML结构变更引发NoneType错误,网页爬取数据格式处理求助
解决HTML爬取中空标签及数据提取问题
我在爬取赛马结果页面时遇到了两个核心问题:
- 页面存在空的
<td>标签,导致通过邻节点查找数据时频繁出现'NoneType' object has no attribute 'findNext'错误 - 更新代码后能拿到包含表头和数据的列表,但无法正确提取表头对应的目标值(比如
GOOD、2:05:1这类)
问题场景
爬取的HTML存在两种情况:
- 存在空
<td>的异常结构:
<td><strong>Track Rating:</strong> GOOD</td> <td></td> <td><strong>Gross Time:</strong> 1:56:5</td> <td><strong>Mile Rate:</strong> 1:56:5</td>
- 结构完整的正常HTML:
<td><strong>Track Rating:</strong> GOOD</td> <td><strong>Gross Time:</strong> 2:29:6</td> <td><strong>Mile Rate:</strong> 1:58:6</td> <td><strong>Lead Time:</strong> 30.3</td>
当前代码与输出
更新后的代码片段:
tableoftimes = race.find('table', class_='raceTimes') for row in tableoftimes.find_all('tr'): string23 = [td.get_text() for td in row.find_all('td')]
输出的列表格式:
['Track Rating: GOOD ', 'Gross Time: 2:05:1 ', 'Mile Rate: 1:56:4 ', 'Lead Time: 8.1 '] ['First Quarter: 29.4 ', 'Second Quarter: 32 ', 'Third Quarter: 28.4 ', 'Fourth Quarter: 27.2 '] ['Margins: HFHD x HFNK']
解决方案
针对这个情况,我们可以把每个列表项拆分成表头和值,存入字典,这样就能轻松提取目标数据,同时避开空标签的问题:
tableoftimes = race.find('table', class_='raceTimes') # 初始化一个字典来存储所有提取的数据 race_data = {} for row in tableoftimes.find_all('tr'): # 遍历每一行的每个td文本,先去除前后空格 for item in [td.get_text().strip() for td in row.find_all('td')]: # 按冒号分割表头和数据,只分割一次避免值里有冒号的情况 if ': ' in item: key, value = item.split(': ', 1) race_data[key] = value # 现在可以直接通过键名获取对应的数据,不存在的键设默认值避免报错 trackrating = race_data.get('Track Rating', '') grosstime = race_data.get('Gross Time', '') milerate = race_data.get('Mile Rate', '') leadtime = race_data.get('Lead Time', '') firstquarter = race_data.get('First Quarter', '') # 其他字段同理...
方案说明
- 用
strip()去除文本前后的空格,避免分割时出现无效内容 - 使用
split(': ', 1)确保只分割第一个冒号,防止值里包含冒号导致数据拆分错误 - 用字典的
get()方法获取值,不存在的字段会返回指定默认值(空字符串/None均可),完美兼容空标签导致的数据缺失场景,不会触发报错
内容的提问来源于stack exchange,提问作者Brad Langtry
相关产品推荐
相关产品推荐

