【译】用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-…

搜索技术问答的公众号:老齐教室

在公众号中回复:老齐,可查看全部文章、书籍、课程。

以为好看,就点赞和转发

相关文章
相关标签/搜索