使用BeautifulSoup爬取网页仅获单条有效数据其余为空如何解决
Python BeautifulSoup 网页爬取空值问题修复方案
你遇到的问题主要有三个原因:
- 你用的
ml1是通用类名,不同页面里第一个带这个类名的元素不一定是地址,选择器定位太泛 - 没有设置请求间隔,短时间内频繁发起请求会被网站反爬策略拦截,返回的页面内容不完整
- 第一步提取的链接里混入了大量非投资者详情页的无效链接,访问这些页面自然拿不到对应数据
修改后的完整可运行代码如下:
import requests from bs4 import BeautifulSoup import pandas as pd import time baseurl = 'https://signal.nfx.com/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36' } # 第一步:获取有效投资者详情页链接 r = requests.get('https://signal.nfx.com/investor-lists/top-who-invested-in-female-founders-investors', headers=headers) soup = BeautifulSoup(r.content, 'html.parser') tra = soup.find_all('div', class_='pr3') productlinks = [] for links in tra: for link in links.find_all('a', href=True): # 只保留投资者详情页的链接,过滤无效链接 if '/investors/' in link['href']: comp = baseurl + link['href'].strip('/') if comp not in productlinks: productlinks.append(comp) p = [] u = [] for link in productlinks: r = requests.get(link, headers=headers) soup = BeautifulSoup(r.content, 'html.parser') # 先定位头部信息的父容器,缩小查找范围 header_meta = soup.find('div', class_='firm-person-header__meta') address = '' site_link = '' if header_meta: # 查找地址 address_tag = header_meta.find('span', class_='ml1') if address_tag: address = address_tag.text.strip() # 查找官网链接 site_tag = header_meta.find('a', class_='ml1 subheader lower-subheader') if site_tag: site_link = site_tag.text.strip() p.append(address) u.append(site_link) # 加2秒请求间隔,避免被反爬 time.sleep(2) df = pd.DataFrame({"address": p, "link": u}) print(df)
主要修改点:
- 新增链接过滤逻辑,只保留
/investors/开头的详情页链接,同时做了去重处理 - 更换了更精准的元素定位逻辑,先找到头部信息的父容器再查找目标元素,避免通用类名匹配到无关内容
- 新增了2秒的请求间隔,避免触发网站的频率限制
- 优化了内容提取逻辑,增加了非空判断,减少空值产生
内容的提问来源于stack exchange,提问作者Amen Aziz
相关产品推荐
相关产品推荐

