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

如何基于模式抓取指定段落的营收范围值并解决AttributeError问题

问题分析与解决

错误原因

出现AttributeError: 'NoneType' object has no attribute 'text'是因为代码中soup.find("span", {"id": "turnover"})或soup.find("span", {"id": "year"})没找到对应元素,返回了None,后续直接调用.text触发报错。常见诱因有两个:

  • 网站存在反爬机制,直接用requests.get请求被拦截,返回的页面并非目标内容;
  • 网页结构已变更,原本id="turnover"和id="year"的span元素不存在,或者营收范围信息被放在其他标签中。

解决方案

1. 模拟浏览器请求,规避反爬

给请求添加headers,模拟正常浏览器访问:

import pandas as pd
from bs4 import BeautifulSoup
import requests

url = 'https://www.informazione-aziende.it/Azienda_EURO-PA-SRL'
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'
}
resp = requests.get(url, headers=headers)

2. 定位正确元素,提取营收范围

访问目标网页查看源代码,确认营收范围的实际位置。如果目标内容是类似“Between 6,000,000 and 30,000,000 Euros”的文本,可通过正则表达式提取:

import re

if resp.status_code == 200:
    soup = BeautifulSoup(resp.text, 'html.parser')
    # 提取页面所有文本内容
    full_text = soup.get_text()
    # 正则匹配营收范围格式
    range_pattern = r"Between (\d{1,3}(?:,\d{3})+) and (\d{1,3}(?:,\d{3})+) Euros"
    match_result = re.search(range_pattern, full_text)
    
    if match_result:
        revenue_range = match_result.group(0)
        # 存入名为"range"的列
        df = pd.DataFrame({'range': [revenue_range]})
        print(df)
    else:
        print("未找到目标营收范围信息")
else:
    print(f"请求失败,状态码:{resp.status_code}")

3. 安全处理元素查找(可选)

如果仍想用标签定位,需先判断元素是否存在,避免报错:

# 处理turnover元素
turnover_elem = soup.find("span", {"id": "turnover"})
turnover = turnover_elem.text.strip() if turnover_elem else "无数据"

# 处理year元素
year_elem = soup.find("span", {"id": "year"})
year = year_elem.text.strip() if year_elem else "无数据"

# 结合营收范围数据构建DataFrame
data = {'range': [revenue_range], 'turnover': turnover, 'year': year}
df = pd.DataFrame(data)
print(df)

内容的提问来源于stack exchange,提问作者Pren Ven

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:21:06