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

如何用Python获取隐藏div的动态HTML源码?(Selenium+BeautifulSoup问题)

解决Selenium无法获取动态加载HTML内容的问题

你的代码在页面刚完成初始加载就立即提取源码,但目标区域的内容是通过JavaScript动态渲染的(可能依赖AJAX请求返回数据后填充,或是延迟加载逻辑),此时DOM尚未更新,所以拿到的是初始的空结构。

以下是可行的解决方法:

方法1:显式等待元素加载完成(推荐)

使用Selenium的WebDriverWait配合预期条件,精准等待目标内容加载完毕后再获取页面源码。可以选择两种等待逻辑:

等待目标子元素出现

比如等待.bar容器内出现子元素,说明内容已填充:

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

driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)

# 等待.bar下出现子元素,超时10秒
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".bar > div"))
)

soup = BeautifulSoup(driver.page_source, 'html.parser')
driver.quit()

# 保存时指定utf-8编码,避免德语特殊字符乱码
with open(r'<my_path>', 'w', encoding='utf-8') as text_file:
    text_file.write(soup.prettify())

等待隐藏类被移除

观察到目标区域初始带有sh-hidden类,内容加载后该类会被移除,可以此为条件等待:

# 替换上面的等待逻辑即可
WebDriverWait(driver, 10).until(
    lambda d: "sh-hidden" not in d.find_element(By.CLASS_NAME, "content").get_attribute("class")
)

方法2:强制等待(仅临时测试用)

如果暂时无法确定精准的等待条件,可使用time.sleep()强制等待固定时长,让JavaScript有足够时间渲染内容,但这种方法灵活性差,等待时间需根据页面实际情况调整:

import time
from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)

time.sleep(5)  # 等待5秒,让内容加载完成

soup = BeautifulSoup(driver.page_source, 'html.parser')
driver.quit()

with open(r'<my_path>', 'w', encoding='utf-8') as text_file:
    text_file.write(soup.prettify())

额外提示

保存文件时务必指定utf-8编码,避免德语中的特殊字符(如变音符号)出现乱码问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:03:18