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

使用Playwright和BeautifulSoup无法抓取covid19.gov.vn指定元素的求助

问题成因

  • 页面对应DOM节点属于延迟异步渲染内容,你调用page.goto()完成后页面还未加载完对应模块,直接获取页面内容自然找不到节点
  • Playwright默认无头模式容易被站点反爬策略识别,站点检测到爬虫访问时不会返回完整的动态渲染内容
  • 目标节点可能嵌套在iframe内,直接读取父页面源码无法获取iframe内的DOM结构

解决步骤

  1. 添加元素等待逻辑,等目标节点加载完成后再提取内容,不要在页面刚加载完成就立刻读源码
  2. 配置Playwright启动参数,绕过站点的自动化工具检测
  3. 先确认目标节点是否在iframe中,若存在嵌套则需要先切换到对应iframe再提取内容

修改后的可运行代码示例:

from bs4 import BeautifulSoup as bs
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    # 配置启动参数绕过反爬检测
    browser = p.chromium.launch(
        headless="new",
        args=["--start-maximized", "--disable-blink-features=AutomationControlled"]
    )
    context = browser.new_context(
        user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
    )
    page = context.new_page()
    page.goto("https://covid19.gov.vn/", timeout=60000)
    # 等待目标元素加载完成,最长等待30秒
    page.wait_for_selector('div#vi.content-tab.show', timeout=30000)
    page_content = page.content()
    soup = bs(page_content, features="lxml")
    test = soup.findAll('div', class_ = "content-tab show", id="vi")
    print(test)
    browser.close()

如果运行时出现元素等待超时的报错,可先在浏览器端重新核对目标节点的选择器是否准确,同时确认节点是否嵌套在iframe标签内,若是iframe嵌套场景,需要单独定位iframe后再提取内部元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:45:02