You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python提取HTML链接转JSON遇问题:无法批量追加链接及KeyError

问题分析与解决方案

核心问题

  1. 数据结构设计错误:你当前用字典直接存储href,每次新匹配到链接时会覆盖旧值,导致最终只剩最后一个链接;同时没有按照期望的ads数组结构来组织数据。
  2. 缺少位置计数逻辑:没有维护一个计数器来生成每个链接的position序号。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:40:30