Pandas read_html方法

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方法的最佳应用,但在某些情况下,这种方法可能会很有用。

希望本文对您有所帮助,感谢您的阅读!

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程