如何用Python的BeautifulSoup(BS4)抓取同class div下首个span内容?
使用BeautifulSoup抓取指定div下第一个span的内容
你的代码逻辑本身是正确的,未成功大概率是请求网页时的问题(比如被反爬拦截),或者可以优化写法提升稳定性。以下是修正和优化后的方案:
1. 解决请求问题并优化代码
很多网站会拦截无请求头的爬虫请求,添加User-Agent模拟浏览器访问即可解决。同时用循环遍历替代硬编码索引,适配元素数量变化:
import requests from bs4 import BeautifulSoup url = "你的目标网页URL" # 添加请求头模拟浏览器 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } # 发送请求并检查状态 response = requests.get(url, headers=headers) if response.status_code == 200: soup = BeautifulSoup(response.content, 'html.parser') # 获取所有class为networkstat的div stat_divs = soup.find_all("div", class_="networkstat") # 遍历每个div,提取第一个span的文本 for div in stat_divs: value = div.find("span").get_text().strip() print(value) else: print(f"请求失败,状态码:{response.status_code}")
2. 更简洁的CSS选择器写法
可以直接用CSS选择器定位每个networkstat下的第一个span,代码更简洁:
import requests from bs4 import BeautifulSoup url = "你的目标网页URL" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } response = requests.get(url, headers=headers) if response.status_code == 200: soup = BeautifulSoup(response.content, 'html.parser') # 直接选中每个networkstat下的第一个span target_spans = soup.select("div.networkstat span:first-of-type") for span in target_spans: print(span.get_text().strip()) else: print(f"请求失败,状态码:{response.status_code}")
排查要点
- 先打印
response.text确认是否获取到了目标HTML内容,如果内容为空或不是目标页面,说明请求被拦截,需要调整请求头(比如添加Cookie、Referer等) - 确认网页不是动态渲染(如果是React/Vue等动态页面,需要用Selenium或Playwright抓取渲染后的内容)
内容的提问来源于stack exchange,提问作者Aimal
相关产品推荐
相关产品推荐

