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

使用Requests+BeautifulSoup爬取页面无结果,本地解析正常求助

我遇到一个问题:右键复制页面完整body内容保存为HTML文件后解析可以正常获取结果,但通过requests直接请求链接解析却得到0条结果。

示例页面:目标HTML页面

bsoup.py(本地解析代码)

使用以下代码时:

from bs4 import BeautifulSoup

with open("index.html") as fp:
    soup = BeautifulSoup(fp, 'html.parser')

cards = soup.select('#__nuxt [data-test="UpCLineClampV2"]')

for card in cards:
    for strong in card.findChildren('strong', recursive=True):
        print('================================================')
        print(strong.next_sibling)

结果:✅正常运行,可获取3封求职信

➜  web_scrap git:(master) ✗ python3 bsoup.py
================================================

    你好!
我有向Alexa发送指令的经验。
关键是你需要向Alexa服务发送音频文件(而非文本)。
接下来要考虑如何处理响应,响应形式有很多种:音频、播放列表、语音提问等等。
不过这完全可行

================================================

    请回答我的问题

================================================

    我是Alexa开发领域的专家

bsoupv2.py(请求链接解析代码)

尝试直接请求链接进行解析:

链接已更新

from bs4 import BeautifulSoup
import requests

headers = {
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': 'GET',
    'Access-Control-Allow-Headers': 'Content-Type',
    'Access-Control-Max-Age': '3600',
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'
    }

url = "目标页面URL"
req = requests.get(url, headers)
soup = BeautifulSoup(req.content, 'html.parser')

soup = soup.find(['body'])
cards = soup.select('#__nuxt [data-test="UpCLineClampV2"]')

for card in cards:
    for strong in card.findChildren('strong', recursive=True):
        print('================================================')
        print(strong.next_sibling)

结果:❌无法运行,未获取到任何求职信内容!

➜  web_scrap git:(master) ✗ python3 bsoupv2.py
➜  web_scrap git:(master) ✗

问题原因

requests库只能获取服务器返回的初始HTML源码,而目标页面的内容是通过JavaScript动态渲染生成的。右键保存的HTML是浏览器执行完所有JS后的完整页面,包含了动态加载的内容;但requests请求到的初始HTML里并没有#__nuxt [data-test="UpCLineClampV2"]这些目标元素,因此解析结果为空。

另外,你添加的Access-Control-*系列请求头是多余的——这些是服务器用来控制跨域的响应头,客户端请求不需要携带,对获取页面内容没有帮助。

解决方案

使用可以模拟浏览器渲染的工具(如Selenium、Playwright),等待页面JS执行完成后再获取页面源码,这样就能拿到和右键保存一致的完整内容。

示例代码(Selenium版本)

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.firefox.options import Options

# 配置无头模式(不打开浏览器窗口)
options = Options()
options.add_argument('--headless')
# 初始化浏览器驱动
driver = webdriver.Firefox(options=options)

# 访问目标页面
driver.get("目标页面URL")

# 获取渲染完成后的页面源码
page_source = driver.page_source
# 关闭浏览器
driver.quit()

# 解析页面
soup = BeautifulSoup(page_source, 'html.parser')
cards = soup.select('#__nuxt [data-test="UpCLineClampV2"]')

for card in cards:
    for strong in card.findChildren('strong', recursive=True):
        print('================================================')
        print(strong.next_sibling)

替代方案(Playwright版本)

Playwright的API更简洁,且自带浏览器驱动,无需手动配置:

  1. 先安装依赖:
pip install playwright
playwright install
  1. 示例代码:
from bs4 import BeautifulSoup
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.firefox.launch(headless=True)
    page = browser.new_page()
    page.goto("目标页面URL")
    page_source = page.content()
    browser.close()

    soup = BeautifulSoup(page_source, 'html.parser')
    cards = soup.select('#__nuxt [data-test="UpCLineClampV2"]')

    for card in cards:
        for strong in card.findChildren('strong', recursive=True):
            print('================================================')
            print(strong.next_sibling)

内容的提问来源于stack exchange,提问作者code-8

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:45:33