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

为何BeautifulSoup的find_all方法无法获取目标class元素?

排查Quora爬取返回空列表的问题

我帮你分析下为啥会返回[],以及对应的解决办法:

1. 最可能的原因:Quora的反爬机制拦截了你的请求

直接用requests.get不带任何请求头的话,Quora很容易识别出这是爬虫请求,返回的页面内容和你在浏览器里看到的完全不一样(可能是反爬验证页面或者简化版页面),自然找不到expanded类的元素。

修复方案:添加请求头模拟浏览器

给请求加上User-Agent,让服务器认为你是从浏览器发起的请求:

import requests
from bs4 import BeautifulSoup

# 模拟Chrome浏览器的请求头,你也可以换成其他浏览器的
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'
}

page = requests.get("https://www.quora.com/How-can-I-write-a-bot-using-Python", headers=headers)
soup = BeautifulSoup(page.content, 'html.parser')
# 先打印下页面长度,确认是否拿到了正常内容
print(f"页面内容长度:{len(page.content)}")
results = soup.find_all(class_='expanded')
print(results)

运行后先看页面长度,如果长度只有几千字节,那还是被反爬了,可能需要加更多请求头(比如Accept-Language)或者换代理。

2. 第二个可能:目标元素是JavaScript动态加载的

BeautifulSoup只能解析静态HTML,如果expanded类的元素是页面加载完成后通过JS动态渲染出来的(比如滚动加载、异步请求),那静态爬取肯定拿不到。

修复方案:用浏览器自动化工具爬取动态内容

比如用Selenium模拟真实浏览器的渲染过程,这样就能拿到完整的动态页面:

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

# 配置Chrome无头模式(不弹出浏览器窗口)
options = Options()
options.add_argument('--headless=new')
options.add_argument('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')

driver = webdriver.Chrome(options=options)
driver.get("https://www.quora.com/How-can-I-write-a-bot-using-Python")

try:
    # 等待最多10秒,直到目标元素加载完成
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'expanded'))
    )
except Exception as e:
    print("等待元素加载超时:", e)
finally:
    # 获取渲染后的页面源码
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    results = soup.find_all(class_='expanded')
    print(results)
    driver.quit()

额外注意事项

  • Quora的反爬很严格,频繁请求容易被封IP,建议每次请求之间加几秒间隔(用time.sleep()),必要时使用代理IP。
  • 网站的类名可能会随时更新,建议你再用浏览器开发者工具(F12)确认一下目标元素的class是不是真的叫expanded,有时候可能是嵌套的类名或者拼写错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:12:43