使用bs4与requests爬取网页找不到指定div、返回HTML不完整如何解决
问题原因与解决思路
返回None的核心原因分为两类:一是网站基础反爬策略拦截了无标识的请求,导致你拿到的页面内容不完整;二是目标div属于前端JS动态渲染生成的元素,requests直接请求拿到的静态HTML源代码中不存在该元素。
排查与解决步骤
- 优先排查反爬拦截问题
多数网站会拒绝没有携带User-Agent的请求,返回异常页面或者截断内容,你可以先修改请求头模拟浏览器发起请求,同时把拿到的页面存到本地确认内容是否完整:
打开本地保存的test.html,如果还是找不到目标div,说明该元素是动态加载的,可选择以下两种方案解决。import requests from bs4 import BeautifulSoup headers = { "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" } URL = "https://www.element14.com/community/community/design-challenges/in-the-air-design-challenge/blog/2014/10/26/firecracker-analyzer-index" page = requests.get(URL, headers=headers) # 保存页面到本地验证内容 with open("test.html", "wb") as f: f.write(page.content) soup = BeautifulSoup(page.content, "lxml") print(soup.find('div', {'class': 'j-comment-wrapper'})) - 方案1:使用动态渲染工具提取
采用支持执行JS的自动化工具加载完整页面,等所有元素渲染完成后再提取内容,示例采用Selenium实现:from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 需提前配置对应浏览器的驱动,此处以Chrome为例 driver = webdriver.Chrome() URL = "https://www.element14.com/community/community/design-challenges/in-the-air-design-challenge/blog/2014/10/26/firecracker-analyzer-index" driver.get(URL) # 最多等待10秒,直到目标div加载完成 comment_div = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "j-comment-wrapper")) ) print(comment_div.get_attribute("outerHTML")) driver.quit() - 方案2:抓包调用数据接口(效率更高)
打开浏览器F12开发者工具,切换到「网络」面板,刷新页面后筛选「Fetch/XHR」类型的请求,找到返回评论数据的后端接口,直接请求该接口就能拿到结构化的JSON数据,无需解析HTML,运行效率远高于页面渲染方案。
内容的提问来源于stack exchange,提问作者KGD
相关产品推荐
相关产品推荐

