无法抓取仅在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
相关产品推荐
相关产品推荐

