网页爬取中用span解析HTML获取浏览数返回None的问题求助
问题分析与解决办法
核心问题:动态内容无法通过静态请求获取
你用requests.get()拿到的是网站的初始静态HTML,而Kommersant文章的浏览数是通过JavaScript动态加载的——也就是说,这个数据不会出现在初始HTML里,而是页面加载完成后,浏览器执行JS脚本从后端接口拉取并渲染到页面上。所以不管怎么用BeautifulSoup解析静态HTML,都找不到目标元素。
另外你的代码还有两个小问题:
- 第二个代码片段里,
find_all的参数名应该是attrs而非attr,而且代码末尾缺少闭合括号,会直接报错。 - BeautifulSoup的解析器推荐用
'html.parser'(Python内置)或'lxml'(需要额外安装),而非'html'。
解决方案
方案1:用Selenium模拟浏览器渲染(适合新手)
Selenium会打开真实浏览器,等待页面JS执行完成后再提取数据,步骤如下:
- 安装Selenium和对应浏览器的驱动(比如ChromeDriver)
- 编写代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = 'https://www.kommersant.ru/doc/4638344' driver = webdriver.Chrome() # 确保ChromeDriver已在系统PATH中 driver.get(url) # 等待浏览数元素加载完成 view_count_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'sharing')) ) print(view_count_element.text) driver.quit()
方案2:直接调用API接口(更高效)
打开浏览器开发者工具(F12),切换到「网络」标签页,刷新页面后可以找到加载浏览数的API请求。比如这个页面的浏览数接口通常是类似https://www.kommersant.ru/frontend/api/v1/documents/{doc_id}/stats的地址,直接请求这个接口就能拿到JSON格式的统计数据:
import requests doc_id = '4638344' api_url = f'https://www.kommersant.ru/frontend/api/v1/documents/{doc_id}/stats' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } response = requests.get(api_url, headers=headers) data = response.json() print(f"浏览数:{data['views']}")
注意:网站的API接口可能会随时调整,需要你自己通过开发者工具确认最新的接口地址和请求参数。
内容的提问来源于stack exchange,提问作者Artem Gorbunov
相关产品推荐
相关产品推荐

