Python提取HTML链接转JSON遇问题:无法批量追加链接及KeyError
问题分析与解决方案
核心问题
- 数据结构设计错误:你当前用字典直接存储
href,每次新匹配到链接时会覆盖旧值,导致最终只剩最后一个链接;同时没有按照期望的ads数组结构来组织数据。 - 缺少位置计数逻辑:没有维护一个计数器来生成每个链接的
position序号。 - KeyError触发原因:如果尝试对未初始化的键进行操作(比如直接往不存在的
ads列表追加元素),就会抛出KeyError。
修正后的代码
from html.parser import HTMLParser # Python3 导入方式,Python2直接import HTMLParser class HtmltoJsonParser(HTMLParser): def __init__(self, raise_exception=True): super().__init__() self.doc = {"ads": []} # 初始化期望的结构,包含ads数组 self.position = 0 # 用于记录链接位置 self.raise_exception = raise_exception @property def json(self): return self.doc @staticmethod def to_json(content, raise_exception=True): parser = HtmltoJsonParser(raise_exception=raise_exception) parser.feed(content) return parser.json def handle_starttag(self, tag, attrs): if tag == "a": for name, link in attrs: if name == "href" and link.startswith("http"): self.position += 1 # 构建每个链接的字典并追加到ads数组 self.doc["ads"].append({ "position": self.position, "link": link })
代码说明
- 初始化时直接创建包含
ads空列表的字典,避免后续KeyError。 - 添加
position计数器,每匹配一个有效链接就自增,生成位置序号。 - 不再直接覆盖字典键,而是将每个链接的信息封装为字典,追加到
ads列表中,保证所有有效链接都被保留。
使用示例
# 假设你已经获取了页面的HTML内容存放在html_content变量中 result = HtmltoJsonParser.to_json(html_content) import json print(json.dumps(result, indent=2))
运行后就能得到你期望的JSON格式输出,所有符合条件的链接都会按顺序存入ads数组。
内容的提问来源于stack exchange,提问作者snoozy
相关产品推荐
相关产品推荐

