为何view-source的HTML与prettify()输出不同?BeautifulSoup查class返回空求助
排查Quora页面无法获取class="expanded"元素的问题
我来帮你分析下为什么你的代码返回空列表,以及对应的解决办法:
1. 核心原因:动态内容加载
Quora这类现代网站大量使用JavaScript动态渲染页面内容。你用requests获取的只是初始HTML骨架,而浏览器中view-source看到的(或者你期望的)expanded元素,很可能是页面加载完成后通过JavaScript动态生成并插入到DOM中的。requests和BeautifulSoup都无法执行JavaScript,自然抓不到这些动态生成的元素。
2. 先试试简单修复:模拟浏览器请求头
有时候Quora会识别非浏览器的请求(比如requests默认的User-Agent),返回简化版的HTML。你可以先添加浏览器的请求头,看看能不能拿到完整内容:
import requests from bs4 import BeautifulSoup url = "https://www.quora.com/How-can-I-write-a-bot-using-Python" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } page = requests.get(url, headers=headers) soup = BeautifulSoup(page.content, 'html.parser') print(soup.find_all(class_='expanded'))
如果这个方法没用,那基本可以确定是动态加载的问题,需要用浏览器模拟工具。
3. 终极解决方案:用浏览器自动化工具抓取动态内容
你可以用selenium或者playwright这类工具模拟真实浏览器的行为,让页面完整渲染后再抓取元素。这里给你一个selenium的示例:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options import time # 配置无头浏览器(不弹出窗口) options = Options() options.add_argument('--headless=new') options.add_argument('--disable-gpu') options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.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") # 等待页面加载完成(根据网络情况调整时间) time.sleep(3) # 查找所有class为expanded的元素 elements = driver.find_elements(By.CLASS_NAME, 'expanded') for elem in elements: print("元素内容:", elem.text) # 如果需要获取HTML结构,可以用elem.get_attribute('innerHTML') # 关闭浏览器 driver.quit()
注意事项
- Quora有严格的反爬机制,频繁请求可能会被封禁IP,建议添加合理的延迟,避免短时间内大量请求。
- 如果需要抓取更多内容,可能需要处理登录、验证码等问题,这会进一步增加复杂度。
内容的提问来源于stack exchange,提问作者user7355384
相关产品推荐
相关产品推荐

