网页特殊格式数据解析:Scrapy抓取足球联赛特殊编码数据问询
特殊赛事数据解析方案(Scrapy环境)
这是体育类站点常用的自定义分隔符序列化数据,未经过加密,仅用特殊符号做字段分隔:~为数据块分隔符,¬为键值对分隔符,÷为键和值的分隔符,无需使用动态渲染工具即可直接解析。
具体解析步骤
- 第一步:在Scrapy的响应回调中,通过XPath
//pre/code/text()直接提取原始字符串,自动过滤掉外层HTML标签 - 第二步:按
~拆分原始字符串得到独立数据块,数据块分为两类:前缀为ZA的联赛分类块、前缀为AA的具体赛事块 - 第三步:遍历每个数据块,用
¬拆分得到单组键值对,再用÷拆分每个键值对的键和值,组装为字典格式 - 第四步:维护当前联赛变量,碰到ZA分类块时更新当前联赛信息,后续AA赛事块直接关联当前联赛信息即可
示例解析代码
import time def parse_sport_data(raw_str): # 清洗首尾空白字符 raw_str = raw_str.strip() # 拆分数据块 blocks = raw_str.split('~') result = [] # 存储当前所属联赛信息 current_league = {} for block in blocks: if not block: continue # 拆分单块内的所有键值对 kv_pairs = block.strip('¬').split('¬') block_dict = {} for kv in kv_pairs: if '÷' not in kv: continue # 仅分割一次,避免值中包含分隔符导致解析错误 k, v = kv.split('÷', 1) block_dict[k] = v # 处理联赛分类块 if 'ZA' in block_dict: current_league = { 'league_full_name': block_dict.get('ZA', ''), 'country': block_dict.get('ZY', ''), 'league_page_path': block_dict.get('ZL', '') } # 处理赛事详情块 elif 'AA' in block_dict: match_info = current_league.copy() match_info.update({ 'match_id': block_dict.get('AA', ''), 'match_start_time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(block_dict.get('AD', 0)))), 'round': block_dict.get('ER', ''), 'home_team_name': block_dict.get('AE', ''), 'away_team_name': block_dict.get('AF', ''), 'home_full_score': int(block_dict.get('AG', 0)), 'away_full_score': int(block_dict.get('AH', 0)), 'home_half_score': int(block_dict.get('BA', 0)), 'away_half_score': int(block_dict.get('BB', 0)) }) result.append(match_info) return result
你可以根据自身需求,提取块字典中其他需要的字段,比如球队ID、队徽地址、赛事状态等。
注意事项
- 键值对拆分时限制拆分次数为1,可兼容部分值中包含分隔符的特殊场景
- 原始数据中的时间为10位秒级时间戳,可根据需求转换为UTC时间或其他时区时间
- 新增自定义提取字段时建议设置默认值,避免部分缺失字段抛出KeyError
内容的提问来源于stack exchange,提问作者Syed Abbad Ul Haq
相关产品推荐
相关产品推荐

