做者: Erik Marsjahtml
翻译:老齐正则表达式
与本文相关的图书推荐:《数据准备和特征工程》,本书已经在【电子工业出版社天猫旗舰店】发售bash
本文,咱们将经过几步演示如何用Pandas的read_html
函数从HTML页面中抓取数据。首先,一个简单的示例,咱们将用Pandas从字符串中读入HTML;而后,咱们将用一些示例,说明如何从Wikipedia的页面中读取数据。markdown
对于数据分析和可视化而言,咱们一般都要载入数据,通常是从已有的文件中导入,好比常见的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 lxml
。spa
read_html
函数使用Pandas的read_html
从HTML的表格中读取数据,其语法很简单:
pd.read_html('URL_ADDRESS_or_HTML_FILE') 复制代码
以上就是read_html
函数的完整使用方法,下面演示示例:
第一个示例,演示如何使用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) 复制代码
在第二个示例中,咱们要从维基百科中抓取数据。咱们要抓取的是关于蟒科的表格数据。
import pandas as pd dfs = pd.read_html('https://en.wikipedia.org/wiki/Pythonidae') 复制代码
如今,咱们获得了一个包含7个表格的列表(len(df)
),若是打开维基百科的那个网页,咱们可以看到第一个表格是页面右边的,在本例中,咱们更关心的是第二个表格:
dfs[1]
复制代码
在第三个示例中,咱们要读取瑞典的新冠病毒(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() 复制代码
用这个方法,咱们仅获得了网页上的表格,可是,如图中所示,倒数三行是没用的,须要删除它们。
iloc
删除最后几行下面,使用Pandas的iloc删除最后三行。注意,咱们使用-3做为第二个参数(若是对此不理解,请参考Pandas有关教程,好比《跟老齐学Python:数据分析》),最后再复制一份数据。
df = dfs[0].iloc[:-3, :].copy()
复制代码
接下来,要学习如何将多级列索引改成一级索引。
如今,咱们要处理多级列索引问题了,准备使用DataFrame.columns
和DataFrame.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()
复制代码
最后一部分,使用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))) 复制代码
本文中,学习了用Pandas的read_html
函数从HTML中读取数据的方法,而且,咱们利用维基百科中的数据建立了一个含有时间序列的图像。不只如此,最后还将“Date”列设置为DataFrame的索引。
原文连接:www.marsja.se/how-to-use-…
搜索技术问答的公众号:老齐教室
在公众号中回复:老齐,可查看全部文章、书籍、课程。
以为好看,就点赞和转发