为什么Python urlopen获取的网页源码与Chrome不同,无法找到modal-body元素?
结果不一致的核心原因
- 你要找的
modal-body节点属于JS动态渲染生成的内容,并不存在于服务端首次返回的静态HTML源码中。Chrome浏览器加载页面后会自动执行页面关联的所有JS代码,完成DOM节点的插入后才会生成你在开发者工具里看到的完整DOM树;而urllib、curl这类工具仅能获取静态HTML,不会执行JS逻辑,因此无法找到对应节点。
可行的解决方案
方案1:使用支持JS渲染的自动化工具(推荐快速适配)
你可以用Selenium、Playwright这类模拟浏览器运行的工具,完整加载页面并等待JS执行完成后再提取元素,以下是Selenium的参考代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options if __name__ == '__main__': # 配置Chrome无头模式,不需要弹出浏览器窗口 chrome_opt = Options() chrome_opt.add_argument("--headless=new") chrome_opt.add_argument("user-agent=Mozilla/5.0") driver = webdriver.Chrome(options=chrome_opt) url = "http://tool.liumingye.cn/music/?page=audioPage&type=migu&name=Unstoppable" driver.get(url) # 等待页面JS渲染完成,也可以换成WebDriverWait显示等待优化执行效率 driver.implicitly_wait(3) # 提取所有modal-body元素 modal_list = driver.find_elements(By.CLASS_NAME, "modal-body") for modal in modal_list: print(modal.get_attribute("outerHTML")) driver.quit()
方案2:抓包调用底层接口(性能更高)
你可以打开Chrome开发者工具的「网络」面板,筛选「XHR/ fetch」类型的请求,刷新页面后找到用来生成modal-body内容的后端接口,直接模拟请求该接口获取数据,不需要解析HTML,运行效率更高。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

