如何利用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
相关产品推荐
相关产品推荐

