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

使用Python Copy Selector抓取网页数据失败:控制台返回空值求助

解决网页抓取返回空列表的问题

问题描述

控制台返回空值,无法将该网站的抓取数据打印到控制台。想要打印选中div的HTML内容,但结果为空。

抓取代码

import requests
import bs4
news=requests.get("https://www.darshan.ac.in/")
soap=bs4.BeautifulSoup(news.text,'lxml')
allnews=soap.select("body > main > div > div.js-ajaxContentLoad > div > div > div.masonry-grid.row>div:nth-child(n+2)") 
print(allnews)

原因分析

  • 动态内容未加载:页面中js-ajaxContentLoad类的元素是通过JavaScript异步加载内容的,requests.get()只能获取页面初始的静态HTML,此时该元素内部还没有目标内容,所以BeautifulSoup无法选中对应的div。
  • 选择器过于脆弱:你使用的是层级严格的CSS选择器,完全依赖页面DOM结构,一旦网站调整布局,这个选择器就会失效。

解决方法

方法1:用Selenium模拟浏览器加载

Selenium可以模拟完整的浏览器环境,等待动态内容加载完成后再抓取:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup

# 初始化Chrome浏览器(需提前安装对应版本的ChromeDriver)
driver = webdriver.Chrome()
driver.get("https://www.darshan.ac.in/")

# 等待目标网格元素加载完成,最多等待10秒
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.masonry-grid.row")))

# 获取加载后的完整页面源码
page_source = driver.page_source
driver.quit()

# 解析并提取内容
soap = BeautifulSoup(page_source, 'lxml')
allnews = soap.select("div.masonry-grid.row > div:nth-child(n+2)")
# 打印每个div的HTML内容
for item in allnews:
    print(item.prettify())

方法2:直接调用AJAX接口(更高效)

打开浏览器开发者工具(F12),切换到「Network」标签页,刷新页面后筛选「XHR」请求,找到加载动态内容的API接口。直接用requests调用该接口获取JSON数据,无需解析HTML,效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:42:21