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

Python+BeautifulSoup写入JSON时返回空数组问题求助

解决爬虫写入JSON返回空数组的问题

兄弟,我来帮你捋捋为啥你的脚本会返回空数组还没报错——毕竟你说其他网站的类似脚本都正常,那大概率是针对cnx.org的细节没处理到位,我给你列几个常见原因和解决办法:

可能的问题点

  • 被网站反爬拦截了:urllib默认的请求头太“素”了,很容易被cnx.org识别成爬虫,返回的是空页面或者无有效数据的内容,自然解析不出东西,数组就空了。
  • 页面选择器不对:你给其他网站写的标签、类名选择器,到cnx.org这里可能完全不适用,比如人家的课程标题用的是h3不是h2,类名是card-title不是title,选错了当然拿不到数据。
  • 代码逻辑有遗漏:比如你可能没初始化存储数据的数组,或者提取数据的循环根本没执行,甚至写入JSON的时候忘了把数组传进去。

具体排查和修复步骤

  1. 给请求加个浏览器请求头
    这是最常见的反爬绕过方法,用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)
    
  2. 先确认是否拿到了页面内容
    在解析页面之前,先打印page_html.decode('utf-8')看看返回的是不是正常的网页内容。如果是403、503这类错误页面,那肯定是被反爬了;如果是正常页面,再去检查你的选择器。

  3. 核对页面元素的选择器
    打开cnx.org的网页,右键“检查”元素,找到你要提取的内容对应的标签和类名,确保代码里的find_all或者select用的选择器和实际页面一致。比如你之前用find_all("div", class_="course"),但这里可能是find_all("article", class_="content-module")。

  4. 调试数据填充过程
    在提取数据的循环里加个print(item),看看有没有输出。如果没输出,说明find_all没找到任何元素,那要么是选择器错了,要么是页面结构动态加载(不过cnx.org大多是静态页面,概率低)。

要是你的代码还有截断的部分(比如你写的uClient = urlopen(opens...后面的内容),可以补充完整,我能帮你更精准地排查~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:54:06