如何用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
相关产品推荐
相关产品推荐

