使用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更简洁,且自带浏览器驱动,无需手动配置:
- 先安装依赖:
pip install playwright playwright install
- 示例代码:
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
相关产品推荐
相关产品推荐

