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

无法抓取仅在F12中存在的HTML元素,求Python爬虫解决方案

问题分析与解决方案

先修正你的代码错误

find_all('b')返回的是匹配到的所有<b>标签的列表(ResultSet),不能直接调用.text。正确写法是遍历每个元素提取文本,或者如果只需要第一个匹配项,改用find('b'):

# 提取所有<b>标签的文本
data = [item.text for item in soup.find_all('b')]
# 仅提取第一个匹配到的<b>标签文本
single_data = soup.find('b').text if soup.find('b') else None

但这解决不了你拿到空列表的核心问题——目标元素是JavaScript动态渲染生成的,requests只能获取页面初始静态源码,无法捕获JS加载后的内容。

适合动态网页抓取的工具

1. Selenium

模拟真实浏览器的完整行为,会加载并执行页面所有JavaScript,能获取到和F12开发者工具中一致的渲染后页面。示例代码:

from selenium import webdriver
from selenium.webdriver.common.by import By

# 需提前下载对应浏览器的驱动(如ChromeDriver)
driver = webdriver.Chrome()
driver.get('http://www.beijingrtj.com/')
# 隐式等待10秒,确保元素加载完成
driver.implicitly_wait(10)
# 抓取所有<b>标签的文本
data = [elem.text for elem in driver.find_elements(By.TAG_NAME, 'b')]
driver.quit()

2. Playwright

微软推出的自动化测试工具,比Selenium更轻量,支持多浏览器,API设计更简洁,自带智能等待机制,无需手动处理元素加载延迟:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto('http://www.beijingrtj.com/')
    # 直接获取所有<b>标签的文本内容
    data = page.locator('b').all_text_contents()
    browser.close()

3. Pyppeteer

基于Chrome DevTools协议的Python实现,会自动下载Chromium浏览器,无需额外配置驱动,适合无界面运行场景:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('http://www.beijingrtj.com/')
    # 通过执行JS代码提取元素文本
    data = await page.evaluate('Array.from(document.querySelectorAll("b")).map(elem => elem.textContent)')
    await browser.close()
    print(data)

asyncio.get_event_loop().run_until_complete(main())

4. Scrapy + Splash

如果需要大规模批量抓取,Scrapy框架配合Splash渲染服务(基于WebKit的JS渲染工具)可以高效处理动态页面,适合爬虫工程化场景。Splash会渲染页面后将完整HTML返回给Scrapy解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:12:34