如何用Python的Selenium提取Naver博客名与作者ID?解析#document问题
我之前爬Naver博客的时候也踩过这个坑!刚好能给你梳理清楚问题和解决办法:
先搞懂什么是#document
你在开发者工具里看到的#document,其实是iframe/frame标签内部的独立文档对象。Naver博客的文章页面做了嵌套设计:外层页面只负责承载框架,真正的博客内容(包括博主信息、博客主页的名称)都放在一个iframe里。这两个文档是独立的上下文,所以你直接操作外层页面时,根本碰不到iframe里的元素,连title拿到的也是外层的文章标题,而非博客名。
解决步骤:切换到iframe上下文再操作
Naver博客的文章页面里,承载内容的iframe id是mainFrame,我们需要先让Selenium切换到这个iframe的上下文,才能访问内部的元素。
完整代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器驱动 driver = webdriver.Chrome() target_url = "https://blog.naver.com/ssamssam48/221271075217" driver.get(target_url) # 等待iframe加载完成并切换上下文 wait = WebDriverWait(driver, 10) main_iframe = wait.until(EC.presence_of_element_located((By.ID, "mainFrame"))) driver.switch_to.frame(main_iframe) # 1. 获取博客名称(两种方式任选) # 方式一:从iframe内部的title提取(格式为「博客名 :: 文章标题」) blog_title = driver.title.split("::")[0].strip() print("博客名称:", blog_title) # 方式二:直接定位博客名称的元素 # blog_title = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="blog-profile"]/div/div[2]/h2/a'))).text # print("博客名称:", blog_title) # 2. 获取作者ID(从script变量提取) blog_id_script = wait.until(EC.presence_of_element_located((By.XPATH, '//script[contains(text(), "var blogId")]'))) script_content = blog_id_script.get_attribute('innerHTML') blog_id = script_content.split("var blogId = '")[1].split("';")[0].strip() print("作者ID:", blog_id) # 如果后续还要操作外层页面,记得切回默认上下文 # driver.switch_to.default_content() # 关闭浏览器 driver.quit()
关键注意点
- 必须用
WebDriverWait等待元素加载:Naver博客加载有延迟,直接定位元素很容易触发「元素不存在」的错误。 - 操作完iframe后,如果还要处理外层页面的内容,记得调用
driver.switch_to.default_content()切回默认上下文。
内容的提问来源于stack exchange,提问作者Chae
相关产品推荐
相关产品推荐

