使用BeautifulSoup爬取网页时目标span标签返回空内容问题求助
问题原因
requests 仅能获取服务器返回的初始静态HTML源码,不会执行页面内嵌的JavaScript代码。你在浏览器元素检查面板看到的#debitorer_name1标签内的文本,是页面初始加载完成后,由JS动态拉取数据填充进去的,初始静态源码里该标签本身就是空的,因此直接用requests爬取只能拿到空标签。
解决方案
你可以根据实际场景二选一:
- 方案1:直接请求动态数据接口(优先推荐,性能最高)
打开浏览器开发者工具,切换到「网络」面板,筛选Fetch/XHR类型请求,刷新页面后逐个查看响应内容,找到返回目标名称文本的接口,后续直接用requests请求该接口即可拿到数据,无需解析完整HTML,爬取效率最高。 - 方案2:使用支持JS渲染的爬虫工具
如果接口参数加密难以直接逆向,可使用能模拟浏览器执行JS的工具加载页面,等JS渲染完成后再提取内容,以Playwright为例:- 先安装依赖:
pip install playwright beautifulsoup4 playwright install chromium- 可直接运行的示例代码:
from bs4 import BeautifulSoup from playwright.sync_api import sync_playwright with sync_playwright() as pw: # 启动无头浏览器 browser = pw.chromium.launch(headless=True) page = browser.new_page( user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" ) # 访问目标页面 page.goto("https://www.nummerplade.net/nummerplade/Dd97487.html") # 等待目标标签加载出非空内容 page.wait_for_selector("#debitorer_name1:not(:empty)") # 获取JS渲染完成后的完整页面源码 rendered_html = page.content() browser.close() soup = BeautifulSoup(rendered_html, "html.parser") name = soup.find("span", id="debitorer_name1") print(name.text)
注意:爬取时建议携带真实浏览器的User-Agent等请求头,模拟正常用户访问特征,避免被站点反爬策略拦截。
内容的提问来源于stack exchange,提问作者Nm12
相关产品推荐
相关产品推荐

