尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

解析JSON嵌套HTML的混合数据:爬虫技术实战

发布时间:2026/9/17 3:07:14

资讯中心
01
ARTICLE

解析JSON嵌套HTML的混合数据:爬虫技术实战

解析JSON嵌套HTML的混合数据:爬虫技术实战
1. 项目背景与挑战在当今数据驱动的互联网环境中爬虫技术已成为获取网络信息的重要手段。然而随着Web技术的复杂化传统的爬虫方案在面对JSON嵌套HTML的混合数据结构时往往力不从心。这种双重编码结构常见于现代单页应用(SPA)、AJAX动态加载页面以及RESTful API返回的富文本内容中。我曾在一个电商价格监控项目中需要从某平台的商品详情API提取数据。API返回的JSON中商品描述字段居然是包含完整HTML标签的字符串而其中又嵌套了JSON格式的规格参数。这种俄罗斯套娃式的数据结构让常规的xpath或正则表达式提取方法完全失效。2. 双重解析的技术本质2.1 JSON中的HTML逃逸问题当HTML被嵌入JSON时会遇到字符转义的连锁反应。例如{ content: div class\spec\{\color\:\red\,\size\:\XL\}/div }这里经历了两次编码HTML中的双引号被转义为\JSON本身又对字符串中的引号进行转义2.2 HTML中的JSON数据识别另一种常见情况是HTML中通过script标签或>div>import json def safe_json_parse(raw_str): try: # 允许控制字符和非标准分隔符 return json.loads(raw_str, strictFalse) except json.JSONDecodeError as e: # 尝试修复常见的JSONP格式 if raw_str.strip().endswith();): return json.loads(raw_str[raw_str.find({):-2]) raise3.2 第二层HTML解析策略推荐使用lxml和html5lib的组合方案from lxml import html from bs4 import BeautifulSoup def extract_embedded_json(html_str): tree html.fromstring(html_str) # 情况1从script标签提取 scripts tree.xpath(//script[typeapplication/json]/text()) for script in scripts: yield safe_json_parse(script) # 情况2从data属性提取 for elem in tree.xpath(//*[starts-with(name(), data-)]): try: yield json.loads(elem) except: continue4. 实战中的边界情况处理4.1 编码冲突解决方案当遇到字符集不一致时建议采用以下处理流程检测原始内容的实际编码(chardet库)统一转换为UTF-8替换非法字符(保留原始位置标记)import chardet def normalize_encoding(byte_data): detected chardet.detect(byte_data) try: return byte_data.decode(detected[encoding]) except: # 应急处理替换非法字符 return byte_data.decode(utf-8, errorsreplace)4.2 性能优化技巧对于大规模抓取任务可以采用以下优化手段预处理过滤通过简单的字符串匹配快速判断是否需要深度解析NEED_DEEP_PARSE_FLAGS (div, {, [) def needs_deep_parse(text): return any(flag in text[:100] for flag in NEED_DEEP_PARSE_FLAGS)缓存解析器实例避免重复创建昂贵的解析器对象from functools import lru_cache lru_cache(maxsize10) def get_cached_parser(parser_type): if parser_type html: return html.HTMLParser() elif parser_type json: return json.JSONDecoder()5. 完整解决方案示例下面是一个整合了所有技术的完整爬虫类实现import json import re from lxml import html from bs4 import BeautifulSoup import chardet from functools import lru_cache class HybridSpider: def __init__(self): self.html_parser html.HTMLParser() self.json_pattern re.compile(r{[^{}]*}) def extract_from_html(self, html_str): 从HTML字符串中提取所有可能的JSON数据 results [] # 方法1BeautifulSoup提取script标签 soup BeautifulSoup(html_str, html5lib) for script in soup.find_all(script, typeapplication/json): try: results.append(json.loads(script.string)) except: continue # 方法2lxml提取data属性 tree html.fromstring(html_str) for elem in tree.xpath(//*[starts-with(name(), data-)]): try: results.append(json.loads(elem)) except: continue # 方法3正则表达式兜底 for match in self.json_pattern.finditer(html_str): try: results.append(json.loads(match.group())) except: continue return results def process_response(self, response): 处理包含混合内容的响应 # 编码检测与转换 content normalize_encoding(response.content) # 第一层尝试作为JSON解析 try: data json.loads(content) if isinstance(data, dict) or isinstance(data, list): # 检查值中是否包含HTML for key, value in data.items() if isinstance(data, dict) else enumerate(data): if isinstance(value, str) and ( in value and in value): embedded self.extract_from_html(value) if embedded: data[key] embedded return data except json.JSONDecodeError: pass # 第二层作为HTML处理 return self.extract_from_html(content)6. 实际应用中的经验教训在金融数据抓取项目中我遇到了几个典型问题日期格式冲突JSON中的日期字符串被HTML转义后正则表达式无法识别。解决方案是优先处理开头的HTML实体import html def preprocess_text(text): return html.unescape(text).replace(quot;, )性能陷阱某次对10万条记录的分析中未缓存的解析器使耗时增加了300%。关键优化点是使用lru_cache缓存解析器对已知结构采用预处理跳过机制实现渐进式解析策略反爬对抗某些网站会故意在JSON中插入畸形HTML注释。应对方案包括def clean_html_comments(html_str): return re.sub(r!--.*?--, , html_str, flagsre.DOTALL)7. 工具链推荐根据不同的使用场景可以考虑以下技术组合场景推荐工具优势快速原型开发BeautifulSoup json开发效率高大规模生产环境lxml orjson解析速度快复杂文档处理html5lib jsonschema容错能力强实时流处理selectolax simdjson内存占用低对于特别复杂的嵌套情况可以考虑使用专门的解析状态机from pyparsing import nestedExpr, QuotedString json_expr nestedExpr({, }) html_tag QuotedString(, endQuoteChar) hybrid_parser (json_expr | html_tag)[...]这种方案虽然学习曲线陡峭但能处理绝大多数边界情况。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。