【譯】用Pandas從HTML網頁中讀取數據

做者: Erik Marsjahtml

翻譯:老齊正則表達式

與本文相關的圖書推薦:《數據準備和特徵工程》,本書已經在【電子工業出版社天貓旗艦店】發售bash

電子工業出版社天貓旗艦店有售


本文,咱們將經過幾步演示如何用Pandas的read_html函數從HTML頁面中抓取數據。首先,一個簡單的示例,咱們將用Pandas從字符串中讀入HTML;而後,咱們將用一些示例,說明如何從Wikipedia的頁面中讀取數據。markdown

用Python載入數據

對於數據分析和可視化而言,咱們一般都要載入數據,通常是從已有的文件中導入,好比常見的CSV文件或者Excel文件。從CSV文件中讀入數據,可使用Pandas的read_csv方法。例如:網絡

import pandas as pd

df = pd.read_csv('CSVFILE.csv')
複製代碼

上面的方法一般用於導入結構化的數據,好比CSV或者JSON等。app

咱們平時更多使用維基百科的信息,它們一般是以HTML的表格形式存在。函數

爲了得到這些表格中的數據,咱們能夠將它們複製粘貼到電子表格中,而後用Pandas的read_excel讀取。這樣固然能夠,然而如今,咱們要用網絡爬蟲的技術自動完成數據讀取。oop

預備知識

用Pandas讀取HTML表格數據,固然要先安裝Pandas了。此處使用pip來安裝(也可使用其它方式,好比Anaconda, ActivePython等),安裝方法pip install pandas學習

注意,若是執行此命令後會自動檢查pip是否須要升級,若是有必要請升級。此外,咱們也會使用lxml或者BeautifulSoup4這些包,安裝方法仍是用pip:pip install lxmlspa

read_html函數

使用Pandas的read_html從HTML的表格中讀取數據,其語法很簡單:

pd.read_html('URL_ADDRESS_or_HTML_FILE')
複製代碼

以上就是read_html函數的完整使用方法,下面演示示例:

示例1

第一個示例,演示如何使用Pandas的read_html函數,咱們要從一個字符串中的HTML表格讀取數據。

import pandas as pd

html = '''<table> <tr> <th>a</th> <th>b</th> <th>c</th> <th>d</th> </tr> <tr> <td>1</td> <td>2</td> <td>3</td> <td>4</td> </tr> <tr> <td>5</td> <td>6</td> <td>7</td> <td>8</td> </tr> </table>'''


df = pd.read_html(html)
複製代碼

如今,咱們所獲得的結果不是Pandas的DataFrame對象,而是一個Python列表對象,可使用tupe()函數檢驗一下:

type(df)
複製代碼

示例2

在第二個示例中,咱們要從維基百科中抓取數據。咱們要抓取的是關於蟒科的表格數據。

import pandas as pd

dfs = pd.read_html('https://en.wikipedia.org/wiki/Pythonidae')
複製代碼

如今,咱們獲得了一個包含7個表格的列表(len(df)),若是打開維基百科的那個網頁,咱們可以看到第一個表格是頁面右邊的,在本例中,咱們更關心的是第二個表格:

dfs[1]
複製代碼

示例3

在第三個示例中,咱們要讀取瑞典的新冠病毒(covid-19)數據。此處,須要在read_html方法中增長一個參數,而後實施數據清洗,最後要對這些數據進行可視化。

抓取數據

打開網頁,會看到頁面中的表格上寫着「New COVID-19 cases in Sweden by county」,如今,咱們就使用match參數和這個字符串:

dfs = pd.read_html('https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_Sweden',
                  match='New COVID-19 cases in Sweden by county')
dfs[0].tail()
複製代碼

用這個方法,咱們僅獲得了網頁上的表格,可是,如圖中所示,倒數三行是沒用的,須要刪除它們。

用Pandas的iloc刪除最後幾行

下面,使用Pandas的iloc刪除最後三行。注意,咱們使用-3做爲第二個參數(若是對此不理解,請參考Pandas有關教程,好比《跟老齊學Python:數據分析》),最後再複製一份數據。

df = dfs[0].iloc[:-3, :].copy()
複製代碼

接下來,要學習如何將多級列索引改成一級索引。

修改多級索引爲一級,並刪除沒必要要的字符

如今,咱們要處理多級列索引問題了,準備使用DataFrame.columnsDataFrame.columns,get_level_values():

df.columns = df.columns.get_level_values(1)
複製代碼

最後,如你所見,在「Date」那一列,咱們用read_html從維基百科網頁的表格中得到數據以後,還有一些說明,接下來使用str.replace函數和正則表達式對其進行修訂:

df['Date'] = df['Date'].str.replace(r"\[.*?\]","")
複製代碼

set_index更改索引

咱們繼續使用Pandas的set_index方法將日期列設置爲索引,這樣作可以爲後面的做圖提供一個時間類型的Series對象。

df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
複製代碼

爲了後續的做圖須要,咱們須要用0填充缺失值,而後將相應列的數據類型改成數字類型。爲此,使用apply方法。最後,使用cumsum()方法獲得每一列的逐項求和的值。

df.fillna(0, inplace=True)
df = df.iloc[:,0:21].apply(pd.to_numeric)

df = df.cumsum()
複製代碼

用時間Series做圖

最後一部分,使用read_html所獲得的數據,建立一個時間序列的圖像。首先,要導入matplotlib,能夠用legend函數定義圖例的位置。

%matplotlib inline
import matplotlib.pyplot as plt
f = plt.figure()

plt.title('Covid cases Sweden', color='black')
df.iloc[:,0:21].plot(ax=f.gca())

plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5)))
複製代碼

結論:如何從HTML中讀取數據並轉化爲DataFrame類型

本文中,學習了用Pandas的read_html函數從HTML中讀取數據的方法,而且,咱們利用維基百科中的數據建立了一個含有時間序列的圖像。不只如此,最後還將「Date」列設置爲DataFrame的索引。

原文連接:www.marsja.se/how-to-use-…

搜索技術問答的公衆號:老齊教室

在公衆號中回覆:老齊,可查看全部文章、書籍、課程。

以爲好看,就點贊和轉發

相關文章
相關標籤/搜索