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

如何利用BeautifulSoup去除JSON文件中的重复条目?

解决BeautifulSoup爬取后JSON重复条目的问题

嗨,这问题在多页爬取时太常见了——要么是网站分页逻辑有重叠,要么是我们爬取时不小心重复收集了条目。我给你几个实用的方案,从源头避免重复到事后处理都有:

1. 爬取时就检查去重(推荐,节省后续处理成本)

核心思路是在把条目加入列表前,先确认它没出现过。最好用一个唯一标识来判断,比如教材的详情页URL(比标题更可靠,毕竟可能有同名教材)。

结合你的代码,修改后大概是这样:

from urllib.request import urlopen 
from bs4 import BeautifulSoup as soup 
import json 

urls = ['https://open.bccampus.ca/find-open-textbooks/', 'https://open.bccampus.ca/find-open-textbooks/?start=10'] 
data = [] 

for url in urls:
    # 建立连接、解析页面(你的原有逻辑)
    uClient = urlopen(url)
    page_html = uClient.read()
    uClient.close()
    page_soup = soup(page_html, "html.parser")
    
    # 替换成你实际抓取教材元素的选择器
    textbook_items = page_soup.find_all("div", class_="textbook-item")
    
    for item in textbook_items:
        # 提取教材信息,生成字典
        book_info = {
            "title": item.find("h3").get_text(strip=True),
            "author": item.find("p", class_="author").get_text(strip=True),
            "detail_url": item.find("a")["href"],
            # 其他你需要的字段...
        }
        
        # 用详情URL判断是否已存在,不存在才加入列表
        if not any(book["detail_url"] == book_info["detail_url"] for book in data):
            data.append(book_info)

# 写入去重后的JSON
with open("textbooks.json", "w") as f:
    json.dump(data, f, indent=4)

2. 用字典快速去重(适合批量处理)

如果已经爬取了一堆数据,或者不想每次都循环检查,可以利用Python字典键唯一的特性:把每个条目的唯一标识作为键,值是条目本身,最后把字典的值转成列表即可。

示例代码:

# 假设你已经爬取到了包含重复条目的data列表
unique_books = {}
for book in data:
    # 用详情URL作为唯一键,替换成你的唯一标识字段
    unique_key = book["detail_url"]
    unique_books[unique_key] = book

# 去重后的列表
data = list(unique_books.values())

# 再写入JSON
with open("unique_textbooks.json", "w") as f:
    json.dump(data, f, indent=4)

3. 事后处理已生成的重复JSON文件

如果已经有了带重复条目的JSON文件,也可以读进去再处理:

import json

# 读取原JSON
with open("duplicate_textbooks.json", "r") as f:
    raw_data = json.load(f)

# 去重逻辑
unique_dict = {}
for entry in raw_data:
    unique_dict[entry["detail_url"]] = entry  # 用唯一标识做键

# 写入去重后的文件
with open("clean_textbooks.json", "w") as f:
    json.dump(list(unique_dict.values()), f, indent=4)

小提醒:如果发现重复特别多,最好检查下网站的分页参数是不是有问题——比如start=10是不是真的从第11个条目开始,有没有和第一页重叠。不过上面的方法已经能帮你解决最终结果的重复问题啦~

内容的提问来源于stack exchange,提问作者brawlins4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:50:15