Python學習筆記:Pandas之read_html、to_html函數


一、read_html函數

Pandas 包中的 read_html() 函數是最簡單的爬蟲,可以爬取靜態網頁表格數據。

但只適合於爬取 table 表格型數據,例如:

## 通過F12查看HTML結構
## http://www.air-level.com/air/guangzhou/
<table class="..." id="...">
     <thead>
     <tr>
     <th>...</th>
     </tr>
     </thead>
     <tbody>
        <tr>
            <td>...</td>
        </tr>
        <tr>...</tr>
        <tr>...</tr>
        ...
        <tr>...</tr>
        <tr>...</tr>
    </tbody>
</table>

1.語法解釋

import pandas as pd
pd.read_html(io, match='.+', flavor=None, header=None, index_col=None,
            skiprows=None, attrs=None, parse_dates=False, tupleize_cols=None,
            thousands=',', encoding=None, decimal='.', converters=None,
            na_values=None, keep_default_na=True, displayed_only=True)
# 常用的參數
io:url、html文本、本地文件等
flavor:解析器
header:標題行
skiprows:跳過的行
attrs:屬性,例如:attrs = {'id':'table'}
parse_dates:解析日期
# 注意:返回的結果是DataFrame組成的list

2.實操

import pandas as pd
data = pd.read_html("http://www.air-level.com/air/guangzhou/", encoding='utf-8', header=0)[0]
'''
       監測站  AQI 空氣質量等級     PM2.5      PM10 首要污染物
0  廣州番禺大學城   53      良  33 μg/m3  55 μg/m3  PM10
1  廣州市八十六中   41      優  21 μg/m3  40 μg/m3   NaN
2  廣州廣東商學院   37      優  26 μg/m3  36 μg/m3   NaN
3   廣州南沙黃閣   31      優   8 μg/m3  30 μg/m3   NaN
4   廣州市監測站   30      優  18 μg/m3  29 μg/m3   NaN
'''

Pandas 獲取網頁表格時,會同時解析所有表格,並存儲為 list 格式,因此需要通過切片的方式 table[x] 指定表格。

import pandas as pd
data = pd.read_html("http://www.air-level.com/rank", encoding='utf-8', header=0)[1]
# 即可獲取右邊表格

3.批量

以新浪財經機構持股匯總數據為例:

# 網址:http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jgcg/index.phtml?p=46
# 共47頁
import pandas as pd
data = pd.DataFrame()
for i in range(1, 48):
    url = r"http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jgcg/index.phtml?p={}".format(i)
    print(url)
    data = pd.concat([data, pd.read_html(url)[0]])
    # 爬取並且合並DataFrame
data2 = data.loc[data["證券代碼"].notna(),:].reset_index(drop=True)

data.shape # (3688, 9)

二、to_html函數

Pandas 導出數據有 to_csvto_sqlto_excel 等,還可以利用 pd.to_html() 函數將數據存儲為 html 格式。

import os
import pandas as pd

os.chdir(r"C:\Users\Hider\Desktop")

data = pd.read_excel(r"C:\Users\Hider\Desktop\test.xlsx")
data.head()
html_table = data.to_html('test.html')

生成 test.html 文件,通過瀏覽器可打開。

通過 print 打印,可以看到 DataFrame 的內部結構被自動轉換為嵌入表格的 <TH><TR><TD> 標簽,保留所有內部層級結構。

print(data.to_html())
'''
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>證券代碼</th>
      <th>證券簡稱</th>
      <th>機構數</th>
      <th>機構數變化</th>
      <th>持股比例(%)</th>
      <th>持股比例增幅(%)</th>
      <th>占流通股比例(%)</th>
      <th>占流通股比例增幅(%)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
'''

1.參數

data.to_html('test.html', header=True, index=False, justify='center')

DataFrame.to_html(buf=None, columns=None, col_space=None, 
                  header=True, index=True,na_rep='NaN',
                  formatters=None, float_format=None, sparsify=None,
                  index_names=True,justify=None,
                  bold_rows=True,classes=None, escape=True, max_rows=None,
                  max_cols=None,show_dimensions=False,
                  notebook=False, decimal='.', border=None)

# 參數解釋
buf : StringIO-like, 可選
    寫入緩沖區。
columns : sequence,可選
    要轉化的列的列名;默認值 None 為所有列轉化。
col_space : int,可選
    每列的最小寬度。
header : bool,可選
    是否打印列標簽,默認為 True。
index : 布爾值,可選
    是否打印索引(行)標簽,默認為 True。
na_rep : 字符串,可選
    指定 NAN 的字符串表示形式,默認為 'NaN'。
formatters : 多個單參數函數組成的列表或字典,可選
    格式化程序可按列表的所索引或字典的鍵名稱應用於列元素,默認為 None。
    每個單參數函數的結果必須是一個 unicode 字符串。列表的長度必須等於列數。
float_format: 單參數函數,可選
    用於將列元素設置為浮點數的格式化程序功能,默認為無。
    此單參數函數的結果必須是 unicode 字符串。
sparsify : bool,可選
    默認為 True。輸入 False 時,對於具有層次結構索引的 DataFrame,會在每一行打印多重索引。
index_names : bool,可選
    打印索引名稱,默認為 True。
line_width : int,可選
    換行符的寬度,默認為不換行。
justify : 列標簽對齊方式, 可選
    左右對齊列標簽。默認為 None時,使用打印配置中的選項(由 set_option 控制),則右對齊。
bold_rows : bool, 可選
    對橫向表格線進行加粗。
classes : CSS類(es)適用於生成的html表, 可選
    默認 None
escape : bool, 可選
    將 "<", ">", "&" 轉化成 html 安全序列(??),默認 True。
max_rows : int, 可選
    顯示最大行數。
max_cols : int, 可選
    顯示最大列數。
decimal : str, 可選
    小數分隔符, 默認為 '.'。
border : int, 可選
    表格外邊框寬度,默認為 1,參數為 0 時表格無邊框。數值越大外邊框越寬。

還可對標題、顏色等進行調整。

2.拓展

結合 Flask 庫可實現頁面交互展示。

參考鏈接1:最簡單的爬蟲:用Pandas爬取表格數據

參考鏈接2:活用Pandas:將Excel轉為html格式

參考鏈接3:DataFrame.to_html()詳解 將數據框 DataFrame 轉為 html 表格


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM