Python+BeautifulSoup写入JSON时返回空数组问题求助
解决爬虫写入JSON返回空数组的问题
兄弟,我来帮你捋捋为啥你的脚本会返回空数组还没报错——毕竟你说其他网站的类似脚本都正常,那大概率是针对cnx.org的细节没处理到位,我给你列几个常见原因和解决办法:
可能的问题点
- 被网站反爬拦截了:urllib默认的请求头太“素”了,很容易被cnx.org识别成爬虫,返回的是空页面或者无有效数据的内容,自然解析不出东西,数组就空了。
- 页面选择器不对:你给其他网站写的标签、类名选择器,到cnx.org这里可能完全不适用,比如人家的课程标题用的是
h3不是h2,类名是card-title不是title,选错了当然拿不到数据。 - 代码逻辑有遗漏:比如你可能没初始化存储数据的数组,或者提取数据的循环根本没执行,甚至写入JSON的时候忘了把数组传进去。
具体排查和修复步骤
给请求加个浏览器请求头
这是最常见的反爬绕过方法,用Request对象自定义User-Agent,模拟正常浏览器访问:from urllib.request import urlopen, Request from bs4 import BeautifulSoup as soup import json openstax = 'https://cnx.org' # 模拟Chrome浏览器的请求头,你也可以换成其他浏览器的 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'} req = Request(openstax, headers=headers) uClient = urlopen(req) page_html = uClient.read() uClient.close() # 解析页面 page_soup = soup(page_html, "html.parser") # 这里替换成你实际要提取的元素选择器,比如先试试提取所有导航链接 items = page_soup.find_all("a", class_="nav-link") data = [] for item in items: data.append({"text": item.text.strip(), "link": item.get("href")}) # 写入JSON文件 with open("openstax_data.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=4)先确认是否拿到了页面内容
在解析页面之前,先打印page_html.decode('utf-8')看看返回的是不是正常的网页内容。如果是403、503这类错误页面,那肯定是被反爬了;如果是正常页面,再去检查你的选择器。核对页面元素的选择器
打开cnx.org的网页,右键“检查”元素,找到你要提取的内容对应的标签和类名,确保代码里的find_all或者select用的选择器和实际页面一致。比如你之前用find_all("div", class_="course"),但这里可能是find_all("article", class_="content-module")。调试数据填充过程
在提取数据的循环里加个print(item),看看有没有输出。如果没输出,说明find_all没找到任何元素,那要么是选择器错了,要么是页面结构动态加载(不过cnx.org大多是静态页面,概率低)。
要是你的代码还有截断的部分(比如你写的uClient = urlopen(opens...后面的内容),可以补充完整,我能帮你更精准地排查~
内容的提问来源于stack exchange,提问作者brawlins4
相关产品推荐
相关产品推荐

