Pandas read_html方法
在本文中,我们将介绍Pandas中的read_html方法。它可以用于从HTML表格中读取数据,并将其转换为Pandas DataFrame对象。read_html方法非常方便,因为它自动检测并解析HTML标记,并将HTML表格中的数据自动转换为DataFrame对象。
阅读更多:Pandas 教程
read_html语法
read_html方法接受一个网址、文件名或HTML文本作为输入,并返回一个由DataFrame对象组成的列表。该方法的语法如下所示:
pandas.read_html(io, match='.+', flavor=None, header=None, index_col=None, skiprows=None, attrs=None, parse_dates=False, thousands=',', encoding=None, decimal='.')
参数解释如下:
- io(必须):可以是HTML文本、URL或文件。
- match(可选):一个正则表达式,用于选择要读取的表格。如果有多个表格,请使用列表。
- flavor(可选):一种解析器以解析HTML。为“bs4”、“html5lib”(默认)或“lxml”之一。
- header(可选):列名。默认为0,表示使用第一行作为列名。如果没有表头,则设置为None。
- index_col(可选):用作行标签的列名或列索引。如果没有列名,则设置为None。
- skiprows(可选):应在读取时跳过的行数。
- attrs(可选):一个字典,包含要用于定位表格的HTML属性。例如,{‘class’:’my_class’, ‘id’:’my_id’}。
- parse_dates(可选):在读取数据时,将指定列解析为日期。如果日期不能解析,则返回NaN。
- thousands(可选):用于隔离千位数的字符。默认为逗号。
- encoding(可选):HTML的编码。
- decimal(可选):用于解析小数的字符。默认为句点。
现在让我们看看如何使用read_html方法来读取HTML表格,并将其转换为Pandas DataFrame对象。
读取HTML表格
首先,我们需要获取包含HTML表格的网站的URL。在本例中,我们将使用世界银行的GDP数据网站。请注意,我们将使用Python内置的urllib库来获取HTML文本。
import pandas as pd
import urllib
url = 'http://wdi.worldbank.org/table/2.1'
html = urllib.request.urlopen(url).read()
现在,我们将使用Pandas read_html方法来读取HTML表格并转换为DataFrame对象。
df = pd.read_html(html)
print(df)
当我们运行上面的代码时,它将输出一个列表,其中包含单个DataFrame对象。默认情况下,它使用HTML表格的第一行作为列名。
[ Unnamed: 0 1960 ... 2019 2020*
0 Population, total NaN ... 771346810 NaN
1 Land area (sq. km) NaN ... 110963751 NaN
2 GDP (current US) NaN ... 8375410512109 NaN
3 GDP growth (annual %) NaN ... NaN NaN
4 GDP per capita (current US) NaN ... 10858.0 NaN
5 Inflation, consumer prices (annual %) NaN ... NaN NaN
6 GNI (current US) NaN ... 8842827178598 NaN
7 GNI per capita (current US) NaN ... 11471.0 NaN
8 GDP deflator (base year varies by country) NaN ... NaN NaN
9 Poverty headcount ratio (% of population) NaN ... NaN NaN
10 Pregnant women receiving prenatal care (%) NaN ... NaN NaN
11 Births attended by skilled health staff (% of total) NaN ... NaN NaN
12 Mortality rate, under-5 (per 1,000 live births) NaN ... NaN NaN
[13 rows x 63 columns]]
如上所示,我们已经成功读取了网站上的GDP数据表格,并将其转换为Pandas DataFrame对象。
选择要读取的表格
有时,HTML页面上可能包含多个表格。在这种情况下,可以使用match参数来选择要读取的表格。例如,假设我们只想读取GDP表格。
df = pd.read_html(html, match='GDP ')
print(df)
当我们运行上面的代码时,它将返回包含GDP表格的DataFrame对象的列表。
使用定位器读取表格
有时HTML表格中可能没有表头,或者表头不在第一行。在这种情况下,可以使用attrs参数来定位表格。
例如,假设我们要从以下HTML文本中读取表格:
<table>
<tbody>
<tr><td>John</td><td>Doe</td><td>40</td></tr>
<tr><td>Jane</td><td>Smith</td><td>35</td></tr>
<tr><td>Bill</td><td>Johnson</td><td>50</td></tr>
</tbody>
</table>
我们可以使用attrs参数来定位表格。例如,以下代码将读取包含以上HTML文本的表格,并将其转换为DataFrame对象。
html = '''
<table>
<tbody>
<tr><td>John</td><td>Doe</td><td>40</td></tr>
<tr><td>Jane</td><td>Smith</td><td>35</td></tr>
<tr><td>Bill</td><td>Johnson</td><td>50</td></tr>
</tbody>
</table>
'''
df = pd.read_html(html, attrs={'table': 'tbody'})
print(df)
在这个例子中,我们使用了一个字典,将表格的HTML属性定位到tbody元素,以便读取表格。
解析日期
在某些情况下,HTML表格中的某些列可能包含日期。在这种情况下,可以使用parse_dates参数来将日期解析为Pandas日期对象。
例如,以下代码读取包含日期的HTML表格并将其转换为DataFrame对象。
html = '''
<table>
<tbody>
<tr><td>2019-01-01</td><td>100</td></tr>
<tr><td>2019-01-02</td><td>200</td></tr>
<tr><td>2019-01-03</td><td>300</td></tr>
</tbody>
</table>
'''
df = pd.read_html(html, parse_dates=True)
print(df)
在这里,我们将parse_dates参数设置为True,以将第一列中的日期解析为Pandas日期对象。
使用Pandas中的read_html方法读取CSV数据
Pandas中的read_html方法还可以用于从CSV文件中读取数据。但是,使用它从CSV中读取数据并不是首选方法。
然而,在某些情况下,您可能会遇到以HTML格式保存的CSV数据。在这种情况下,您可以使用read_html方法来读取这些数据。
例如,以下代码从包含CSV格式数据的HTML文件中读取数据。
html = '''
<table>
<tbody>
<tr><td>John,Doe,40</td></tr>
<tr><td>Jane,Smith,35</td></tr>
<tr><td>Bill,Johnson,50</td></tr>
</tbody>
</table>
'''
df = pd.read_html(html, flavor='html5lib')[0]
df = pd.DataFrame([x.split(',') for x in df[0]])
print(df)
在这里,我们首先使用html5lib解析器从HTML文件中读取表格。然后,我们通过使用列表推导式和split方法将单个单元格中的值拆分成多个列。
总结
通过本文,我们了解了如何使用Pandas read_html方法从HTML表格中读取数据,并转换为Pandas DataFrame对象。我们学习了如何选择要读取的表格,如何使用定位器来定位表格,如何解析日期,并且还学习了如何使用read_html方法从包含CSV格式数据的HTML文件中读取数据。
使用Pandas read_html方法可以大大简化从HTML表格中读取数据的过程,因为它自动检测并解析HTML标记,将HTML表格中的数据自动转换为Pandas DataFrame对象。
虽然从CSV文件中读取数据并不是使用read_html方法的最佳应用,但在某些情况下,这种方法可能会很有用。
希望本文对您有所帮助,感谢您的阅读!