如何使用Selenium抓取隐藏app-root元素文本并自动爬取法律修订版本
问题原因
你遇到的返回None的问题是因为目标站点是客户端渲染的单页应用(SPA),初始加载的页面源码只有空的app-root容器和无脚本提示,你调用driver.get()后立刻获取页面源码,此时页面的JS还没完成执行、法律文本内容还没渲染到DOM里,所以BeautifulSoup找不到id为lawcontent的元素。
解决方案
给代码添加显式等待逻辑,等目标元素渲染完成后再提取页面源码即可,修改后的代码如下:
from selenium import webdriver from webdriver_manager.firefox import GeckoDriverManager from selenium.webdriver import FirefoxOptions # 新增需要导入的等待相关模块 from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup from markdownify import markdownify url = "https://www.fedlex.admin.ch/eli/cc/1999/404/en" opts = FirefoxOptions() opts.add_argument("--headless") # 可选:添加参数避免无头模式被站点识别拦截 opts.add_argument("--disable-blink-features=AutomationControlled") driver = webdriver.Firefox(executable_path=GeckoDriverManager().install(), options=opts) driver.get(url) # 新增:最多等待10秒,直到lawcontent元素渲染完成 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "lawcontent")) ) # 确认元素出现后再提取页面源码 html = driver.page_source soup = BeautifulSoup(html, "html.parser") div = soup.find("div", {"id": "lawcontent"}) content = markdownify(str(div)) print(content[:200]) finally: # 确保无论是否成功都关闭浏览器进程 driver.quit()
补充说明
如果遇到偶尔加载失败的情况,可以把等待时长适当拉长到15-20秒,也可以在等待元素出现后再加1秒的强制等待,确保文本内容完全渲染完成再提取。
内容的提问来源于stack exchange,提问作者quadratecode
相关产品推荐
相关产品推荐

