案例描述

在大数据时代,企业财务数据对于税务分析至关重要。通过对企业的财务报表进行分析,可以洞察企业的经营状况,为税务合规性检查、风险评估以及政策制定提供依据。本实验将介绍如何使用Python爬取证券之星上的特定公司的资产负债表、利润表、现金流量表,并探讨这些数据在税务大数据分析中的作用。

1. 项目介绍(前置任务:爬取企业的基本信息)

在大数据时代,数据采集是数据分析的重要基础。通过爬取网站上的公司资料,可以获取企业的基本信息,为税务分析和商业决策提供重要的数据支持。本文将展示如何利用爬虫技术爬取浪潮软件的公司资料。

2. 目标网站简介

证券之星始创于1996年,纳斯达克上市公司——中国金融在线旗下网站,是中国最早的理财服务专业网站,是专业的投资理财服务平台,是中国最大的财经资讯网站与移动财经服务提供商,同时也是中国最领先的互联网媒体。——百度百科

png

浪潮软件的股票代码是600756 找到我们需要的网站

观察网站URL可知,'/xxxxx_600756.shtml' 路径中的 xxxxx_600756 包含了股票代码 600756,表明这是关于浪潮软件公司的具体页面。'600756'嵌入在路径中的股票代码表明该页面特定于浪潮软件公司。这种命名方式适用于其他公司的页面,只需替换不同的股票代码即可访问相应的公司信息页面。目标页面如下:

png

3.网站分析

  • 打开目标网页: 打开浏览器,进入目标网页:证券之星 - 浪潮软件。

  • 进入开发者工具: 按 F12 打开开发者工具,或者右键点击页面并选择“检查”或“检查元素”。

  • 使用元素选择器: 在开发者工具中,选择元素选择器(通常是一个鼠标图标)。然后在页面上点击你想要抓取的内容,这将直接定位到相应的 HTML 元素。

  • 获取选择器: 在开发者工具中,可以看到元素的 HTML 代码。右键点击该元素,在弹出菜单中选择“复制” -> 复制XPath。

我们想要爬取的内容位于 //*[@id="sta_3"]/div[1]/div[2]/table 路径下

png

4.撰写代码-资产负债表

  • 导入库:

requests 用于发送 HTTP 请求。 lxml.html 用于解析和处理 HTML。 函数 get_table_content:

  • 构造目标 URL:

设置请求头以模拟浏览器行为。 发送 GET 请求以获取网页内容。 使用 lxml.html.fromstring 解析网页内容为树结构。 使用 xpath 方法找到指定的 table 元素。 使用 html.tostring 方法将元素转换为字符串。

  • 主程序:

定义一个函数:get_table_content,函数的参数为stock_code,代表企业的股票代码。用户输入股票代码以指定要爬取的网页。 调用 get_table_content 函数爬取并打印表格内容。

In [1]:
import requests
from lxml import html

def get_table_content_balance(stock_code):
    # 目标URL
    url = f'https://stock.quote.stockstar.com/finance/balance_{stock_code}.shtml'
    
    # 请求头,模拟浏览器行为
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    
    # 发送请求
    response = requests.get(url, headers=headers)
    
    # 检查请求是否成功
    if response.status_code == 200:
        # 解析HTML
        tree = html.fromstring(response.content)
        
        # 使用XPath找到目标table元素
        table_elements = tree.xpath('//*[@id="sta_3"]/div[1]/div[2]')   #刚刚复制的XPath路径
        
        if table_elements:
            # 提取并返回table内容
            table_content = html.tostring(table_elements[0], encoding='unicode')
            return table_content
        else:
            return "未找到目标table元素"
    else:
        return f'请求失败,状态码: {response.status_code}'

# 输入企业股票代码
stock_code = input("请输入企业股票代码: ")
table_content_balance = get_table_content_balance(stock_code)

if table_content_balance:
    print("表格内容:")
    print(table_content_balance)
请输入企业股票代码: 600756
表格内容:
<div class="con zcfzbDetail_wrap">    
    <h4 class="ts">该公司暂无该信息</h4>
      
    </div>
  

5.将提取出来的资产负债表数据存到excel文件中

我们已经将爬取出来的表格内容存储在table_content中,下面对爬取的 HTML 表格数据进行数据清洗并转换为结构化数据(如 EXCEL 文件),我们需要做以下几步:

  • 解析 HTML 表格:提取表格的行和列。
  • 清洗数据:处理可能的空格、换行符等。
  • 保存为 EXCEL:将清洗后的数据保存为 EXCEL 文件。
In [2]:
#导入新的类库
from bs4 import BeautifulSoup
import pandas as pd

# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(table_content_balance, 'html.parser')

# 提取表格中的所有行
rows = soup.find_all('tr')

# 创建一个列表来存储所有的数据
data = []

# 遍历每一行
for row in rows:
    cols = row.find_all('td')  # 找到所有的 td 标签
    cols = [ele.text.strip() for ele in cols]  # 提取文本,并去除前后空格
    data.append([ele for ele in cols if ele])  # 添加数据到列表

#预览数据
print (data)
[]

**提示:** 为保证后台Excel表格命名不冲突,将保存Excel部分代码以"""注释掉了,如需运行,则将下面代码段中前后的"""去掉,然后运行。

In [3]:
"""
# 将信息保存在excel表格中
# 创建 pandas DataFrame,设置第一行为列名
df = pd.DataFrame(data[1:], columns=data[0])
print (df)


# 定义 Excel 文件名和工作表名
file_name = f'{stock_code}balance.xlsx'
sheet_name = 'balance'


# 将 DataFrame 写入 Excel 文件的指定工作表中
with pd.ExcelWriter(file_name, engine='openpyxl') as writer:
    df.to_excel(writer, sheet_name=sheet_name, index=False)
"""
Out[3]:
"\n# 将信息保存在excel表格中\n# 创建 pandas DataFrame,设置第一行为列名\ndf = pd.DataFrame(data[1:], columns=data[0])\nprint (df)\n\n\n# 定义 Excel 文件名和工作表名\nfile_name = f'{stock_code}balance.xlsx'\nsheet_name = 'balance'\n\n\n# 将 DataFrame 写入 Excel 文件的指定工作表中\nwith pd.ExcelWriter(file_name, engine='openpyxl') as writer:\n    df.to_excel(writer, sheet_name=sheet_name, index=False)\n"

6.撰写代码抽取利润表和现金流量表(建议学生自行编写代码)

6.1 抽取利润表

In [4]:
#抽取利润表
def get_table_content_profit(stock_code):
    # 目标URL
    url = f'https://stock.quote.stockstar.com/finance/profit_{stock_code}.shtml'
    
    # 请求头,模拟浏览器行为
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    
    # 发送请求
    response = requests.get(url, headers=headers)
    
    # 检查请求是否成功
    if response.status_code == 200:
        # 解析HTML
        tree = html.fromstring(response.content)
        
        # 使用XPath找到目标table元素
        table_elements = tree.xpath('//*[@id="sta_3"]/div[1]/div/div[2]/table')   
        
        if table_elements:
            # 提取并返回table内容
            table_content = html.tostring(table_elements[0], encoding='unicode')
            return table_content
        else:
            return "未找到目标table元素"
    else:
        return f'请求失败,状态码: {response.status_code}'


table_content_profit = get_table_content_profit(stock_code)

if table_content_profit:
    print("表格内容:")
    print(table_content_profit)
表格内容:
<table width="100%" border="1" cellspacing="0" cellpadding="0" class="globalTable trHover" bordercolor="#d7d6db">
          <tbody class="tbody_right"><tr><td class="bg_td_6 align_left"><strong class="rd">报告期</strong></td><td><strong class="rd">2024-09-30</strong></td><td><strong class="rd">2024-06-30</strong></td><td><strong class="rd">2024-03-31</strong></td><td><strong class="rd">2023-12-31</strong></td></tr><tr><td class="bg_td_6 align_left">公司类型</td><td>通用</td><td>通用</td><td>通用</td><td>通用</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">一、营业总收入</strong></td><td><strong class="rd">1,033,295,551.88</strong></td><td><strong class="rd">566,440,371.41</strong></td><td><strong class="rd">265,571,198.91</strong></td><td><strong class="rd">2,553,201,195.51</strong></td></tr><tr><td class="bg_td_6 align_left">营业收入</td><td>1,033,295,551.88</td><td>566,440,371.41</td><td>265,571,198.91</td><td>2,553,201,195.51</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">二、营业总成本</strong></td><td><strong class="rd">1,095,672,434.33</strong></td><td><strong class="rd">634,877,800.25</strong></td><td><strong class="rd">285,527,331.47</strong></td><td><strong class="rd">2,454,098,719.18</strong></td></tr><tr><td class="bg_td_6 align_left">营业成本</td><td>622,574,254.17</td><td>321,114,916.65</td><td>141,576,658.05</td><td>1,673,848,502.59</td></tr><tr><td class="bg_td_6 align_left">税金及附加</td><td>6,197,813.48</td><td>4,210,615.38</td><td>634,683.01</td><td>12,003,509.55</td></tr><tr><td class="bg_td_6 align_left">销售费用</td><td>54,945,041.48</td><td>34,624,355.56</td><td>15,525,191.43</td><td>106,375,440.63</td></tr><tr><td class="bg_td_6 align_left">管理费用</td><td>229,350,025.3</td><td>149,658,731.16</td><td>74,979,996.22</td><td>386,253,891.22</td></tr><tr><td class="bg_td_6 align_left">研发费用</td><td>189,599,785.41</td><td>131,215,166.91</td><td>56,393,007.22</td><td>295,330,785.21</td></tr><tr><td class="bg_td_6 align_left">财务费用</td><td>-6,994,485.51</td><td>-5,945,985.41</td><td>-3,582,204.46</td><td>-19,713,410.02</td></tr><tr><td class="bg_td_6 align_left">其中:利息费用</td><td>-</td><td>-</td><td>-</td><td>770,715.44</td></tr><tr><td class="bg_td_6 align_left">其中:利息收入</td><td>7,307,077.28</td><td>6,056,281.97</td><td>3,610,872.25</td><td>20,725,057.22</td></tr><tr><td class="bg_td_6 align_left">加:投资收益</td><td>3,557,605.45</td><td>4,200,161.4</td><td>2,038,164.66</td><td>8,145,170.72</td></tr><tr><td class="bg_td_6 align_left">资产处置收益</td><td>-489.68</td><td>5,702.36</td><td>2,703.05</td><td>26,561.25</td></tr><tr><td class="bg_td_6 align_left">资产减值损失(新)</td><td>-390,895.05</td><td>-509,319.75</td><td>-574,205.74</td><td>-13,096,009.52</td></tr><tr><td class="bg_td_6 align_left">信用减值损失(新)</td><td>-42,039,135.31</td><td>-26,631,668.29</td><td>-15,033,814.65</td><td>-26,990,175.41</td></tr><tr><td class="bg_td_6 align_left">其他收益</td><td>2,415,761.54</td><td>1,487,521.93</td><td>1,477,599.36</td><td>17,575,373.53</td></tr><tr><td class="bg_td_6 align_left">营业利润平衡项目</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">四、营业利润</strong></td><td><strong class="rd">-98,834,035.5</strong></td><td><strong class="rd">-89,885,031.19</strong></td><td><strong class="rd">-32,045,685.88</strong></td><td><strong class="rd">84,763,396.9</strong></td></tr><tr><td class="bg_td_6 align_left">加:营业外收入</td><td>65,000.08</td><td>65,000.06</td><td>0.03</td><td>104,999.89</td></tr><tr><td class="bg_td_6 align_left">减:营业外支出</td><td>1,792.82</td><td>1,593.91</td><td>1,578.16</td><td>339,237.11</td></tr><tr><td class="bg_td_6 align_left">利润总额平衡项目</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">五、利润总额</strong></td><td><strong class="rd">-98,770,828.24</strong></td><td><strong class="rd">-89,821,625.04</strong></td><td><strong class="rd">-32,047,264.01</strong></td><td><strong class="rd">84,529,159.68</strong></td></tr><tr><td class="bg_td_6 align_left">减:所得税费用</td><td>-2,150,351.57</td><td>255,433.7</td><td>-3,096,696.16</td><td>-7,150,500.66</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">六、净利润</strong></td><td><strong class="rd">-96,620,476.67</strong></td><td><strong class="rd">-90,077,058.74</strong></td><td><strong class="rd">-28,950,567.85</strong></td><td><strong class="rd">91,679,660.34</strong></td></tr><tr><td class="bg_td_6 align_left">持续经营净利润</td><td>-96,620,476.67</td><td>-90,077,058.74</td><td>-28,950,567.85</td><td>91,679,660.34</td></tr><tr><td class="bg_td_6 align_left">归属于母公司股东的净利润</td><td>-94,738,685.23</td><td>-88,598,358.61</td><td>-28,589,466.15</td><td>90,988,676.68</td></tr><tr><td class="bg_td_6 align_left">少数股东损益</td><td>-1,881,791.44</td><td>-1,478,700.13</td><td>-361,101.7</td><td>690,983.66</td></tr><tr><td class="bg_td_6 align_left">(一)基本每股收益</td><td>-0.29</td><td>-0.27</td><td>-0.09</td><td>0.28</td></tr><tr><td class="bg_td_6 align_left">(二)稀释每股收益</td><td>-0.29</td><td>-0.27</td><td>-0.09</td><td>0.28</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">九、综合收益总额</strong></td><td><strong class="rd">-96,620,476.67</strong></td><td><strong class="rd">-90,077,058.74</strong></td><td><strong class="rd">-28,950,567.85</strong></td><td><strong class="rd">91,679,660.34</strong></td></tr><tr><td class="bg_td_6 align_left">归属于母公司股东的综合收益总额</td><td>-94,738,685.23</td><td>-88,598,358.61</td><td>-28,589,466.15</td><td>90,988,676.68</td></tr><tr><td class="bg_td_6 align_left">归属于少数股东的综合收益总额</td><td>-1,881,791.44</td><td>-1,478,700.13</td><td>-361,101.7</td><td>690,983.66</td></tr><tr><td class="bg_td_6 align_left">公告日期</td><td>2024-10-31</td><td>2024-08-30</td><td>2024-04-30</td><td>2024-04-18</td></tr><tr><td class="bg_td_6 align_left">审计意见(境内)</td><td></td><td></td><td></td><td>标准无保留意见</td></tr></tbody>
        </table>
        
        
      
In [5]:
# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(table_content_profit, 'html.parser')

# 提取表格中的所有行
rows = soup.find_all('tr')

# 创建一个列表来存储所有的数据
data = []

# 遍历每一行
for row in rows:
    cols = row.find_all('td')  # 找到所有的 td 标签
    cols = [ele.text.strip() for ele in cols]  # 提取文本,并去除前后空格
    data.append([ele for ele in cols if ele])  # 添加数据到列表

#预览数据
print (data)
[['报告期', '2024-09-30', '2024-06-30', '2024-03-31', '2023-12-31'], ['公司类型', '通用', '通用', '通用', '通用'], ['一、营业总收入', '1,033,295,551.88', '566,440,371.41', '265,571,198.91', '2,553,201,195.51'], ['营业收入', '1,033,295,551.88', '566,440,371.41', '265,571,198.91', '2,553,201,195.51'], ['二、营业总成本', '1,095,672,434.33', '634,877,800.25', '285,527,331.47', '2,454,098,719.18'], ['营业成本', '622,574,254.17', '321,114,916.65', '141,576,658.05', '1,673,848,502.59'], ['税金及附加', '6,197,813.48', '4,210,615.38', '634,683.01', '12,003,509.55'], ['销售费用', '54,945,041.48', '34,624,355.56', '15,525,191.43', '106,375,440.63'], ['管理费用', '229,350,025.3', '149,658,731.16', '74,979,996.22', '386,253,891.22'], ['研发费用', '189,599,785.41', '131,215,166.91', '56,393,007.22', '295,330,785.21'], ['财务费用', '-6,994,485.51', '-5,945,985.41', '-3,582,204.46', '-19,713,410.02'], ['其中:利息费用', '-', '-', '-', '770,715.44'], ['其中:利息收入', '7,307,077.28', '6,056,281.97', '3,610,872.25', '20,725,057.22'], ['加:投资收益', '3,557,605.45', '4,200,161.4', '2,038,164.66', '8,145,170.72'], ['资产处置收益', '-489.68', '5,702.36', '2,703.05', '26,561.25'], ['资产减值损失(新)', '-390,895.05', '-509,319.75', '-574,205.74', '-13,096,009.52'], ['信用减值损失(新)', '-42,039,135.31', '-26,631,668.29', '-15,033,814.65', '-26,990,175.41'], ['其他收益', '2,415,761.54', '1,487,521.93', '1,477,599.36', '17,575,373.53'], ['营业利润平衡项目', '0', '0', '0', '0'], ['四、营业利润', '-98,834,035.5', '-89,885,031.19', '-32,045,685.88', '84,763,396.9'], ['加:营业外收入', '65,000.08', '65,000.06', '0.03', '104,999.89'], ['减:营业外支出', '1,792.82', '1,593.91', '1,578.16', '339,237.11'], ['利润总额平衡项目', '0', '0', '0', '0'], ['五、利润总额', '-98,770,828.24', '-89,821,625.04', '-32,047,264.01', '84,529,159.68'], ['减:所得税费用', '-2,150,351.57', '255,433.7', '-3,096,696.16', '-7,150,500.66'], ['六、净利润', '-96,620,476.67', '-90,077,058.74', '-28,950,567.85', '91,679,660.34'], ['持续经营净利润', '-96,620,476.67', '-90,077,058.74', '-28,950,567.85', '91,679,660.34'], ['归属于母公司股东的净利润', '-94,738,685.23', '-88,598,358.61', '-28,589,466.15', '90,988,676.68'], ['少数股东损益', '-1,881,791.44', '-1,478,700.13', '-361,101.7', '690,983.66'], ['(一)基本每股收益', '-0.29', '-0.27', '-0.09', '0.28'], ['(二)稀释每股收益', '-0.29', '-0.27', '-0.09', '0.28'], ['九、综合收益总额', '-96,620,476.67', '-90,077,058.74', '-28,950,567.85', '91,679,660.34'], ['归属于母公司股东的综合收益总额', '-94,738,685.23', '-88,598,358.61', '-28,589,466.15', '90,988,676.68'], ['归属于少数股东的综合收益总额', '-1,881,791.44', '-1,478,700.13', '-361,101.7', '690,983.66'], ['公告日期', '2024-10-31', '2024-08-30', '2024-04-30', '2024-04-18'], ['审计意见(境内)', '标准无保留意见']]

**提示:** 为保证后台Excel表格命名不冲突,将保存Excel部分代码以"""注释掉了,如需运行,则将下面代码段中前后的"""去掉,然后运行。

In [6]:
"""
# 将信息保存在excel表格中
# 创建 pandas DataFrame,设置第一行为列名
df = pd.DataFrame(data[1:], columns=data[0])
print (df)


# 定义 Excel 文件名和工作表名
file_name = f'{stock_code}profit.xlsx'
sheet_name = 'profit'


# 将 DataFrame 写入 Excel 文件的指定工作表中
with pd.ExcelWriter(file_name, engine='openpyxl') as writer:
    df.to_excel(writer, sheet_name=sheet_name, index=False)
"""
Out[6]:
"\n# 将信息保存在excel表格中\n# 创建 pandas DataFrame,设置第一行为列名\ndf = pd.DataFrame(data[1:], columns=data[0])\nprint (df)\n\n\n# 定义 Excel 文件名和工作表名\nfile_name = f'{stock_code}profit.xlsx'\nsheet_name = 'profit'\n\n\n# 将 DataFrame 写入 Excel 文件的指定工作表中\nwith pd.ExcelWriter(file_name, engine='openpyxl') as writer:\n    df.to_excel(writer, sheet_name=sheet_name, index=False)\n"

6.2 抽取现金流量表

In [7]:
#抽取现金流量表
def get_table_content_cashflow(stock_code):
    # 目标URL
    url = f'https://stock.quote.stockstar.com/finance/cashflow_{stock_code}.shtml'
    
    # 请求头,模拟浏览器行为
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    
    # 发送请求
    response = requests.get(url, headers=headers)
    
    # 检查请求是否成功
    if response.status_code == 200:
        # 解析HTML
        tree = html.fromstring(response.content)
        
        # 使用XPath找到目标table元素
        table_elements = tree.xpath('//*[@id="sta_3"]/div[1]/div/div[2]/table')   
        
        if table_elements:
            # 提取并返回table内容
            table_content = html.tostring(table_elements[0], encoding='unicode')
            return table_content
        else:
            return "未找到目标table元素"
    else:
        return f'请求失败,状态码: {response.status_code}'


table_content_cashflow = get_table_content_cashflow(stock_code)

if table_content_cashflow:
    print("表格内容:")
    print(table_content_cashflow)
表格内容:
<table width="100%" border="1" cellspacing="0" cellpadding="0" class="globalTable trHover" bordercolor="#d7d6db">
          <tbody class="tbody_right"><tr><td class="bg_td_6 align_left"><strong class="rd">报告期</strong></td><td><strong class="rd">2024-09-30</strong></td><td><strong class="rd">2024-06-30</strong></td><td><strong class="rd">2024-03-31</strong></td><td><strong class="rd">2023-12-31</strong></td></tr><tr><td class="bg_td_6 align_left">公司类型</td><td>通用</td><td>通用</td><td>通用</td><td>通用</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">一、经营活动产生的现金流量:</strong></td><td><strong class="rd"></strong></td><td><strong class="rd"></strong></td><td><strong class="rd"></strong></td><td><strong class="rd"></strong></td></tr><tr><td class="bg_td_6 align_left">销售商品、提供劳务收到的现金</td><td>808,536,868.39</td><td>493,162,040.99</td><td>218,226,070.5</td><td>2,097,636,479.82</td></tr><tr><td class="bg_td_6 align_left">收到的税费返还</td><td>451,517.96</td><td>343,278.35</td><td>331,355.78</td><td>1,707,770.79</td></tr><tr><td class="bg_td_6 align_left">收到其他与经营活动有关的现金</td><td>10,548,213.11</td><td>6,853,982.78</td><td>4,550,885.91</td><td>33,592,917.7</td></tr><tr><td class="bg_td_6 align_left">经营活动现金流入的平衡项目</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">经营活动现金流入小计</strong></td><td><strong class="rd">819,536,599.46</strong></td><td><strong class="rd">500,359,302.12</strong></td><td><strong class="rd">223,108,312.19</strong></td><td><strong class="rd">2,132,937,168.31</strong></td></tr><tr><td class="bg_td_6 align_left">购买商品、接受劳务支付的现金</td><td>747,258,453.05</td><td>497,683,816.01</td><td>327,906,924.38</td><td>1,436,856,469.14</td></tr><tr><td class="bg_td_6 align_left">支付给职工以及为职工支付的现金</td><td>315,622,136.41</td><td>224,558,410.83</td><td>91,871,863.92</td><td>438,388,302.21</td></tr><tr><td class="bg_td_6 align_left">支付的各项税费</td><td>14,334,443.3</td><td>12,441,163.87</td><td>6,480,311.87</td><td>29,844,817.76</td></tr><tr><td class="bg_td_6 align_left">支付其他与经营活动有关的现金</td><td>283,965,785.44</td><td>232,311,598.36</td><td>68,469,243.4</td><td>200,700,174.1</td></tr><tr><td class="bg_td_6 align_left">经营活动现金流出的平衡项目</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">经营活动现金流出小计</strong></td><td><strong class="rd">1,361,180,818.2</strong></td><td><strong class="rd">966,994,989.07</strong></td><td><strong class="rd">494,728,343.57</strong></td><td><strong class="rd">2,105,789,763.21</strong></td></tr><tr><td class="bg_td_6 align_left">经营活动产生的现金流量净额平衡项目</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">经营活动产生的现金流量净额</strong></td><td><strong class="rd">-541,644,218.74</strong></td><td><strong class="rd">-466,635,686.95</strong></td><td><strong class="rd">-271,620,031.38</strong></td><td><strong class="rd">27,147,405.1</strong></td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">二、投资活动产生的现金流量:</strong></td><td><strong class="rd"></strong></td><td><strong class="rd"></strong></td><td><strong class="rd"></strong></td><td><strong class="rd"></strong></td></tr><tr><td class="bg_td_6 align_left">收回投资收到的现金</td><td>-</td><td>-</td><td>-</td><td>500,118,232.47</td></tr><tr><td class="bg_td_6 align_left">处置固定资产、无形资产和其他长期资产收回的现金净额</td><td>43,762.38</td><td>37,428.51</td><td>4,000.9</td><td>391,437.6</td></tr><tr><td class="bg_td_6 align_left">投资活动现金流入的平衡项目</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">投资活动现金流入小计</strong></td><td><strong class="rd">43,762.38</strong></td><td><strong class="rd">37,428.51</strong></td><td><strong class="rd">4,000.9</strong></td><td><strong class="rd">500,509,670.07</strong></td></tr><tr><td class="bg_td_6 align_left">购建固定资产、无形资产和其他长期资产支付的现金</td><td>33,770,308.95</td><td>20,255,851.42</td><td>8,670,295.84</td><td>38,478,228.03</td></tr><tr><td class="bg_td_6 align_left">投资支付的现金</td><td>-</td><td>-</td><td>-</td><td>220,000,000</td></tr><tr><td class="bg_td_6 align_left">取得子公司及其他营业单位支付的现金</td><td>-</td><td>-</td><td>-</td><td>901,764.62</td></tr><tr><td class="bg_td_6 align_left">支付其他与投资活动有关的现金</td><td>549,032.23</td><td>-</td><td>-</td><td>-</td></tr><tr><td class="bg_td_6 align_left">投资活动现金流出的平衡项目</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">投资活动现金流出小计</strong></td><td><strong class="rd">34,319,341.18</strong></td><td><strong class="rd">20,255,851.42</strong></td><td><strong class="rd">8,670,295.84</strong></td><td><strong class="rd">259,379,992.65</strong></td></tr><tr><td class="bg_td_6 align_left">投资活动产生的现金流量净额平衡项目</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">投资活动产生的现金流量净额</strong></td><td><strong class="rd">-34,275,578.8</strong></td><td><strong class="rd">-20,218,422.91</strong></td><td><strong class="rd">-8,666,294.94</strong></td><td><strong class="rd">241,129,677.42</strong></td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">三、筹资活动产生的现金流量:</strong></td><td><strong class="rd"></strong></td><td><strong class="rd"></strong></td><td><strong class="rd"></strong></td><td><strong class="rd"></strong></td></tr><tr><td class="bg_td_6 align_left">吸收投资收到的现金</td><td>2,450,000</td><td>-</td><td>-</td><td>4,000,000</td></tr><tr><td class="bg_td_6 align_left">其中:子公司吸收少数股东投资收到的现金</td><td>2,450,000</td><td>-</td><td>-</td><td>4,000,000</td></tr><tr><td class="bg_td_6 align_left">筹资活动现金流入平衡项目</td><td>0</td><td>-</td><td>-</td><td>0</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">筹资活动现金流入小计</strong></td><td><strong class="rd">2,450,000</strong></td><td><strong class="rd">-</strong></td><td><strong class="rd">-</strong></td><td><strong class="rd">4,000,000</strong></td></tr><tr><td class="bg_td_6 align_left">分配股利、利润或偿付利息支付的现金</td><td>11,343,456.36</td><td>11,343,456.36</td><td>-</td><td>9,722,962.59</td></tr><tr><td class="bg_td_6 align_left">支付其他与筹资活动有关的现金</td><td>-</td><td>-</td><td>-</td><td>38,677,830.42</td></tr><tr><td class="bg_td_6 align_left">筹资活动现金流出平衡项目</td><td>0</td><td>0</td><td>-</td><td>0</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">筹资活动现金流出小计</strong></td><td><strong class="rd">11,343,456.36</strong></td><td><strong class="rd">11,343,456.36</strong></td><td><strong class="rd">-</strong></td><td><strong class="rd">48,400,793.01</strong></td></tr><tr><td class="bg_td_6 align_left">筹资活动产生的现金流量净额平衡项目</td><td>0</td><td>0</td><td>-</td><td>0</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">筹资活动产生的现金流量净额</strong></td><td><strong class="rd">-8,893,456.36</strong></td><td><strong class="rd">-11,343,456.36</strong></td><td><strong class="rd">-</strong></td><td><strong class="rd">-44,400,793.01</strong></td></tr><tr><td class="bg_td_6 align_left">现金及现金等价物净增加额平衡项目</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">五、现金及现金等价物净增加额</strong></td><td><strong class="rd">-584,813,253.9</strong></td><td><strong class="rd">-498,197,566.22</strong></td><td><strong class="rd">-280,286,326.32</strong></td><td><strong class="rd">223,876,289.51</strong></td></tr><tr><td class="bg_td_6 align_left">加:期初现金及现金等价物余额</td><td>912,171,376.06</td><td>912,171,376.06</td><td>912,171,376.06</td><td>688,295,086.55</td></tr><tr><td class="bg_td_6 align_left">期末现金及现金等价物余额平衡项目</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">期末现金及现金等价物余额</strong></td><td><strong class="rd">327,358,122.16</strong></td><td><strong class="rd">413,973,809.84</strong></td><td><strong class="rd">631,885,049.74</strong></td><td><strong class="rd">912,171,376.06</strong></td></tr><tr><td class="bg_td_6 align_left"><strong class="rd">补充资料:</strong></td><td><strong class="rd"></strong></td><td><strong class="rd"></strong></td><td><strong class="rd"></strong></td><td><strong class="rd"></strong></td></tr><tr><td class="bg_td_6 align_left">净利润</td><td>-</td><td>-90,077,058.74</td><td>-</td><td>91,679,660.34</td></tr><tr><td class="bg_td_6 align_left">资产减值准备</td><td>-</td><td>509,319.75</td><td>-</td><td>13,096,009.52</td></tr><tr><td class="bg_td_6 align_left">固定资产和投资性房地产折旧</td><td>-</td><td>16,906,539.54</td><td>-</td><td>17,476,911.09</td></tr><tr><td class="bg_td_6 align_left">其中:固定资产折旧、油气资产折耗、生产性生物资产折旧</td><td>-</td><td>16,906,539.54</td><td>-</td><td>17,476,911.09</td></tr><tr><td class="bg_td_6 align_left">无形资产摊销</td><td>-</td><td>21,807,130</td><td>-</td><td>46,554,948.13</td></tr><tr><td class="bg_td_6 align_left">长期待摊费用摊销</td><td>-</td><td>198,255.48</td><td>-</td><td>621,490.53</td></tr><tr><td class="bg_td_6 align_left">处置固定资产、无形资产和其他长期资产的损失</td><td>-</td><td>-5,702.36</td><td>-</td><td>-26,561.25</td></tr><tr><td class="bg_td_6 align_left">固定资产报废损失</td><td>-</td><td>-</td><td>-</td><td>251,129.14</td></tr><tr><td class="bg_td_6 align_left">财务费用</td><td>-</td><td>-</td><td>-</td><td>770,715.44</td></tr><tr><td class="bg_td_6 align_left">投资损失</td><td>-</td><td>-4,200,161.4</td><td>-</td><td>-8,145,170.72</td></tr><tr><td class="bg_td_6 align_left">递延所得税</td><td>-</td><td>-279,490.64</td><td>-</td><td>-10,294,395.23</td></tr><tr><td class="bg_td_6 align_left">其中:递延所得税资产减少</td><td>-</td><td>-268,568.61</td><td>-</td><td>-10,285,281.81</td></tr><tr><td class="bg_td_6 align_left">递延所得税负债增加</td><td>-</td><td>-10,922.03</td><td>-</td><td>-9,113.42</td></tr><tr><td class="bg_td_6 align_left">存货的减少</td><td>-</td><td>-75,706,983.06</td><td>-</td><td>339,596,999.34</td></tr><tr><td class="bg_td_6 align_left">经营性应收项目的减少</td><td>-</td><td>-181,634,292.14</td><td>-</td><td>-292,889,068.31</td></tr><tr><td class="bg_td_6 align_left">经营性应付项目的增加</td><td>-</td><td>-186,018,806.33</td><td>-</td><td>-206,386,280.33</td></tr><tr><td class="bg_td_6 align_left">现金的期末余额</td><td>-</td><td>413,973,809.84</td><td>-</td><td>912,171,376.06</td></tr><tr><td class="bg_td_6 align_left">减:现金的期初余额</td><td>-</td><td>912,171,376.06</td><td>-</td><td>688,295,086.55</td></tr><tr><td class="bg_td_6 align_left">公告日期</td><td>2024-10-31</td><td>2024-08-30</td><td>2024-04-30</td><td>2024-04-18</td></tr><tr><td class="bg_td_6 align_left">审计意见(境内)</td><td></td><td></td><td></td><td>标准无保留意见</td></tr></tbody>
        </table>
       
        
      
In [8]:
# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(table_content_cashflow, 'html.parser')

# 提取表格中的所有行
rows = soup.find_all('tr')

# 创建一个列表来存储所有的数据
data = []

# 遍历每一行
for row in rows:
    cols = row.find_all('td')  # 找到所有的 td 标签
    cols = [ele.text.strip() for ele in cols]  # 提取文本,并去除前后空格
    data.append([ele for ele in cols if ele])  # 添加数据到列表

#预览数据
print (data)
[['报告期', '2024-09-30', '2024-06-30', '2024-03-31', '2023-12-31'], ['公司类型', '通用', '通用', '通用', '通用'], ['一、经营活动产生的现金流量:'], ['销售商品、提供劳务收到的现金', '808,536,868.39', '493,162,040.99', '218,226,070.5', '2,097,636,479.82'], ['收到的税费返还', '451,517.96', '343,278.35', '331,355.78', '1,707,770.79'], ['收到其他与经营活动有关的现金', '10,548,213.11', '6,853,982.78', '4,550,885.91', '33,592,917.7'], ['经营活动现金流入的平衡项目', '0', '0', '0', '0'], ['经营活动现金流入小计', '819,536,599.46', '500,359,302.12', '223,108,312.19', '2,132,937,168.31'], ['购买商品、接受劳务支付的现金', '747,258,453.05', '497,683,816.01', '327,906,924.38', '1,436,856,469.14'], ['支付给职工以及为职工支付的现金', '315,622,136.41', '224,558,410.83', '91,871,863.92', '438,388,302.21'], ['支付的各项税费', '14,334,443.3', '12,441,163.87', '6,480,311.87', '29,844,817.76'], ['支付其他与经营活动有关的现金', '283,965,785.44', '232,311,598.36', '68,469,243.4', '200,700,174.1'], ['经营活动现金流出的平衡项目', '0', '0', '0', '0'], ['经营活动现金流出小计', '1,361,180,818.2', '966,994,989.07', '494,728,343.57', '2,105,789,763.21'], ['经营活动产生的现金流量净额平衡项目', '0', '0', '0', '0'], ['经营活动产生的现金流量净额', '-541,644,218.74', '-466,635,686.95', '-271,620,031.38', '27,147,405.1'], ['二、投资活动产生的现金流量:'], ['收回投资收到的现金', '-', '-', '-', '500,118,232.47'], ['处置固定资产、无形资产和其他长期资产收回的现金净额', '43,762.38', '37,428.51', '4,000.9', '391,437.6'], ['投资活动现金流入的平衡项目', '0', '0', '0', '0'], ['投资活动现金流入小计', '43,762.38', '37,428.51', '4,000.9', '500,509,670.07'], ['购建固定资产、无形资产和其他长期资产支付的现金', '33,770,308.95', '20,255,851.42', '8,670,295.84', '38,478,228.03'], ['投资支付的现金', '-', '-', '-', '220,000,000'], ['取得子公司及其他营业单位支付的现金', '-', '-', '-', '901,764.62'], ['支付其他与投资活动有关的现金', '549,032.23', '-', '-', '-'], ['投资活动现金流出的平衡项目', '0', '0', '0', '0'], ['投资活动现金流出小计', '34,319,341.18', '20,255,851.42', '8,670,295.84', '259,379,992.65'], ['投资活动产生的现金流量净额平衡项目', '0', '0', '0', '0'], ['投资活动产生的现金流量净额', '-34,275,578.8', '-20,218,422.91', '-8,666,294.94', '241,129,677.42'], ['三、筹资活动产生的现金流量:'], ['吸收投资收到的现金', '2,450,000', '-', '-', '4,000,000'], ['其中:子公司吸收少数股东投资收到的现金', '2,450,000', '-', '-', '4,000,000'], ['筹资活动现金流入平衡项目', '0', '-', '-', '0'], ['筹资活动现金流入小计', '2,450,000', '-', '-', '4,000,000'], ['分配股利、利润或偿付利息支付的现金', '11,343,456.36', '11,343,456.36', '-', '9,722,962.59'], ['支付其他与筹资活动有关的现金', '-', '-', '-', '38,677,830.42'], ['筹资活动现金流出平衡项目', '0', '0', '-', '0'], ['筹资活动现金流出小计', '11,343,456.36', '11,343,456.36', '-', '48,400,793.01'], ['筹资活动产生的现金流量净额平衡项目', '0', '0', '-', '0'], ['筹资活动产生的现金流量净额', '-8,893,456.36', '-11,343,456.36', '-', '-44,400,793.01'], ['现金及现金等价物净增加额平衡项目', '0', '0', '0', '0'], ['五、现金及现金等价物净增加额', '-584,813,253.9', '-498,197,566.22', '-280,286,326.32', '223,876,289.51'], ['加:期初现金及现金等价物余额', '912,171,376.06', '912,171,376.06', '912,171,376.06', '688,295,086.55'], ['期末现金及现金等价物余额平衡项目', '0', '0', '0', '0'], ['期末现金及现金等价物余额', '327,358,122.16', '413,973,809.84', '631,885,049.74', '912,171,376.06'], ['补充资料:'], ['净利润', '-', '-90,077,058.74', '-', '91,679,660.34'], ['资产减值准备', '-', '509,319.75', '-', '13,096,009.52'], ['固定资产和投资性房地产折旧', '-', '16,906,539.54', '-', '17,476,911.09'], ['其中:固定资产折旧、油气资产折耗、生产性生物资产折旧', '-', '16,906,539.54', '-', '17,476,911.09'], ['无形资产摊销', '-', '21,807,130', '-', '46,554,948.13'], ['长期待摊费用摊销', '-', '198,255.48', '-', '621,490.53'], ['处置固定资产、无形资产和其他长期资产的损失', '-', '-5,702.36', '-', '-26,561.25'], ['固定资产报废损失', '-', '-', '-', '251,129.14'], ['财务费用', '-', '-', '-', '770,715.44'], ['投资损失', '-', '-4,200,161.4', '-', '-8,145,170.72'], ['递延所得税', '-', '-279,490.64', '-', '-10,294,395.23'], ['其中:递延所得税资产减少', '-', '-268,568.61', '-', '-10,285,281.81'], ['递延所得税负债增加', '-', '-10,922.03', '-', '-9,113.42'], ['存货的减少', '-', '-75,706,983.06', '-', '339,596,999.34'], ['经营性应收项目的减少', '-', '-181,634,292.14', '-', '-292,889,068.31'], ['经营性应付项目的增加', '-', '-186,018,806.33', '-', '-206,386,280.33'], ['现金的期末余额', '-', '413,973,809.84', '-', '912,171,376.06'], ['减:现金的期初余额', '-', '912,171,376.06', '-', '688,295,086.55'], ['公告日期', '2024-10-31', '2024-08-30', '2024-04-30', '2024-04-18'], ['审计意见(境内)', '标准无保留意见']]

**提示:** 为保证后台Excel表格命名不冲突,将保存Excel部分代码以"""注释掉了,如需运行,则将下面代码段中前后的"""去掉,然后运行。

In [9]:
"""
# 将信息保存在excel表格中
# 创建 pandas DataFrame,设置第一行为列名
df = pd.DataFrame(data[1:], columns=data[0])
print (df)


# 定义 Excel 文件名和工作表名
file_name = f'{stock_code}cashflow.xlsx'
sheet_name = 'cashflow'


# 将 DataFrame 写入 Excel 文件的指定工作表中
with pd.ExcelWriter(file_name, engine='openpyxl') as writer:
    df.to_excel(writer, sheet_name=sheet_name, index=False)
"""
Out[9]:
"\n# 将信息保存在excel表格中\n# 创建 pandas DataFrame,设置第一行为列名\ndf = pd.DataFrame(data[1:], columns=data[0])\nprint (df)\n\n\n# 定义 Excel 文件名和工作表名\nfile_name = f'{stock_code}cashflow.xlsx'\nsheet_name = 'cashflow'\n\n\n# 将 DataFrame 写入 Excel 文件的指定工作表中\nwith pd.ExcelWriter(file_name, engine='openpyxl') as writer:\n    df.to_excel(writer, sheet_name=sheet_name, index=False)\n"

6.3 判断有无企业基本信息文件(是否做过前置任务) ,如果没有则添加

In [10]:
import os
# 定义函数来获取表格内容
def get_table_content(stock_code):
    # 目标URL
    url = f'https://stock.quote.stockstar.com/corp_{stock_code}.shtml'
    
    # 请求头,模拟浏览器行为
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    
    # 发送请求
    response = requests.get(url, headers=headers)
    
    # 检查请求是否成功
    if response.status_code == 200:
        # 解析HTML
        tree = html.fromstring(response.content)
        
        # 使用XPath找到目标table元素
        table_elements = tree.xpath('//*[@id="sta_3"]/div[3]/div[1]/div[1]/div[2]/table')
        
        if table_elements:
            # 提取并返回table内容
            table_content = html.tostring(table_elements[0], encoding='unicode')
            return table_content
        else:
            return "未找到目标table元素"
    else:
        return f'请求失败,状态码: {response.status_code}'

# 主程序
def get_table_content_info(stock_code):
    # 文件名
    filename = f"{stock_code}info.xlsx"

    # 检查文件是否存在
    if not os.path.exists(filename):
        # 获取表格内容
        table_content = get_table_content(stock_code)
        
        if table_content != "未找到目标table元素" and "请求失败" not in table_content:
            # 使用 BeautifulSoup 解析 HTML
            soup = BeautifulSoup(table_content, 'html.parser')

            # 提取表格中的所有行
            rows = soup.find_all('tr')

            # 创建一个列表来存储所有的数据
            data = []

            # 遍历每一行
            for row in rows:
                cols = row.find_all('td')  # 找到所有的 td 标签
                cols = [ele.text.strip() for ele in cols]  # 提取文本,并去除前后空格
                data.append([ele for ele in cols if ele])  # 添加数据到列表
            
            # 将数据转换为DataFrame
            df = pd.DataFrame(data[1:], columns=data[0])  # 假设第一行为表头
            
            # 保存到Excel文件
            df.to_excel(filename, index=False)
        else:
            print(table_content)
    else:
        print("File already exists. Skipping data extraction.")


# 运行主程序
get_table_content_info(stock_code)

7.将企业基本信息和三表整合到一个EXCEL,并将原来文件删除

**提示:** 为保证后台Excel表格命名不冲突,将保存Excel部分代码以"""注释掉了,如需运行,则将下面代码段中前后的"""去掉,然后运行。

In [11]:
"""
# 定义 Excel 文件名
excel_files = [f'{stock_code}info.xlsx',f'{stock_code}balance.xlsx', f'{stock_code}profit.xlsx',f'{stock_code}cashflow.xlsx' ]
# 定义对应的工作表名
sheet_names = ['企业信息', '资产负债表', '利润表', '现金流量表']

# 创建一个 ExcelWriter 对象,用于写入新的 Excel 文件
with pd.ExcelWriter(f'{stock_code}.xlsx', engine='openpyxl') as writer:
    # 遍历每个文件和对应的工作表名
    for file, sheet in zip(excel_files, sheet_names):
        # 读取每个 Excel 文件
        if os.path.exists(file):
            df = pd.read_excel(file)
            # 将 DataFrame 写入新的工作表
            df.to_excel(writer, sheet_name=sheet, index=False)
        else:
            print(f"文件 {file} 不存在,跳过该文件。")

print(f"所有文件已成功合并到 {stock_code} 中,并分别存储在不同的工作表中。")

# 删除原始的 Excel 文件
for file in excel_files:
    if os.path.exists(file):
        os.remove(file)
        print(f"{file} 已删除")
    else:
        print(f"{file} 不存在,无法删除")
"""
Out[11]:
'\n# 定义 Excel 文件名\nexcel_files = [f\'{stock_code}info.xlsx\',f\'{stock_code}balance.xlsx\', f\'{stock_code}profit.xlsx\',f\'{stock_code}cashflow.xlsx\' ]\n# 定义对应的工作表名\nsheet_names = [\'企业信息\', \'资产负债表\', \'利润表\', \'现金流量表\']\n\n# 创建一个 ExcelWriter 对象,用于写入新的 Excel 文件\nwith pd.ExcelWriter(f\'{stock_code}.xlsx\', engine=\'openpyxl\') as writer:\n    # 遍历每个文件和对应的工作表名\n    for file, sheet in zip(excel_files, sheet_names):\n        # 读取每个 Excel 文件\n        if os.path.exists(file):\n            df = pd.read_excel(file)\n            # 将 DataFrame 写入新的工作表\n            df.to_excel(writer, sheet_name=sheet, index=False)\n        else:\n            print(f"文件 {file} 不存在,跳过该文件。")\n\nprint(f"所有文件已成功合并到 {stock_code} 中,并分别存储在不同的工作表中。")\n\n# 删除原始的 Excel 文件\nfor file in excel_files:\n    if os.path.exists(file):\n        os.remove(file)\n        print(f"{file} 已删除")\n    else:\n        print(f"{file} 不存在,无法删除")\n'