vlambda博客
学习文章列表

用 Pandas 读写网页中的 HTML 表格数据

介绍
超文本标记语言(HTML)是用于构建网页的标准标记语言。我们可以使用HTML的 <table> 标签来呈现表格数据。Pandas 数据分析库提供了 read_html() to_html() 之类的功能,因此我们可以将数据导入和导出到DataFrames。
在本文中,我们将学习如何从HTML文件读取表格数据并将其加载到Pandas DataFrame中。我们还将学习如何将数据从Pandas DataFrame写入HTML文件。
读取HTML
我们可以使用 read_html() 函数读取HTML文件的表。此函数将HTML文件的表作为Pandas DataFrames读取。它可以从文件或URL中读取。
从文件中读取HTML数据
在本节中,我们将使用一组输入数据。一个包含编程语言及其创建年份的表。另一个表中有土地面积及其成本(美元)。
将以下HTML内容保存在名为 table_data.html 的文件中:
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Table Data</title>
</head>

<body>
  <table>
    <thead>
      <tr>
        <th>Programming Language</th>
        <th>Creator</th>
        <th>Year</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>C</td>
        <td>Dennis Ritchie</td>
        <td>1972</td>
      </tr>
      <tr>
        <td>Python</td>
        <td>Guido Van Rossum</td>
        <td>1989</td>
      </tr>
      <tr>
        <td>Ruby</td>
        <td>Yukihiro Matsumoto</td>
        <td>1995</td>
      </tr>
    </tbody>
  </table>
  <table>
    <thead>
      <tr>
        <th>
          Area (sq.ft)
        </th>
        <th>
          Price (USD)
        </th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>
          12000
        </td>
        <td>
          500
        </td>
      </tr>
      <tr>
        <td>
          32000
        </td>
        <td>
          700
        </td>
      </tr>

    </tbody>
  </table>
</body>

</html>
Pandas 需要另一个名为lxml的库的帮助来解析HTML和XML文件。为了使 read_html() 函数正常工作,您需要安装lxml:
$ pip install lxml
一旦安装了lmxl,我们就可以使用 read_html() 函数。它返回一个DataFrames列表,其中每个DataFrame是给定HTML文件的整个表元素。我们通过索引列表将每个表作为DataFrame进行读取。
下面的代码演示了 read_html() 函数从HTML文件读取表的使用:
import pandas as pd

tables = pd.read_html('table_data.html')
print('Tables found:', len(tables))
df1 = tables[0]  # Save first table in variable df1
df2 = tables[1]  # Saving next table in variable df2

print('First Table')
print(df1)
print('Another Table')
print(df2)
注意:虽然您需要安装lxml,但无需将其导入程序中即可使Pandas正常工作。
在Python解释器上运行以上代码将产生以下输出:
Tables found: 2
First Table
  Programming Language             Creator  Year
0                    C      Dennis Ritchie  1972
1               Python    Guido Van Rossum  1989
2                 Ruby  Yukihiro Matsumoto  1995
Another Table
   Area (sq.ft)  Price (USD)
0         12000          500
1         32000          700
从URL读取HTML数据
正如我们从HTML文件中读取表元素一样,我们也可以使用 read_html() 将HTML网页中的表元素读取到DataFrame中。我们将提供以下URL:
read_html('https://en.wikipedia.org/wiki/Python_(programming_language)')
它将返回一个DataFrames列表,其中每个DataFrame代表给定URL中的一个表元素。
以下是使用Pandas从网站URL读取表格元素的示例代码:
import pandas as pd

tables = pd.read_html('https://en.wikipedia.org/wiki/Python_(programming_language)')
print('Tables found:', len(tables))
df1 = tables[0]  # Save first table in variable df1
print('First Table')
print(df1.head())  # To print first 5 rows
如果我们成功运行了上面的代码,我们可以看到以下输出:
Tables found: 10
First Table
                0                                                  1
0             NaN                                                NaN
1        Paradigm  Multi-paradigm: functional, imperative, object...
2     Designed by                                   Guido van Rossum
3       Developer                         Python Software Foundation
4  First appeared                              1991; 29 years ago[1]
从需要身份验证的URL读取HTML数据
现在我们知道可以从网站上读取表格元素。但是,当站点需要身份验证时,代码会遇到以下异常:
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 401: UNAUTHORIZED
要从此类URL读取数据,我们将使用请求模块。您可以使用pip安装它:
$ pip install requests
现在,如果站点需要身份验证,我们将使用请求库中的 get() 方法向网站URL发出请求,同时提供可选的 auth 参数。
此方法从网页返回响应对象。我们可以检查状态码(以确保内容肯定存在)并从响应对象获取文本,然后将表转换为DataFrame。
让我们看一个使用请求获取需要身份验证的数据的示例。为此,我们使用 https://httpbin.org
import requests

r = requests.get('https://httpbin.org/basic-auth/john/johnspassword', auth=('john''johnspassword'))

print(r.status_code)
print(r.text)
执行上面的代码后,我们可以看到以下输出:
200
{
  "authenticated"true
  "user""john"
}
这表明我们成功访问了经过身份验证的URL的网页内容。但是,此网站仅包含JSON数据,我们需要HTML表格元素作为DataFrames。
让我们继续使用以前的URL,并使用请求将HTML表读取为DataFrames。与以前的站点是公共站点时相比,访问经过身份验证的内容的步骤是相同的。
得到响应后,可以将 r.text 传递给 read_html() 方法。和往常一样,我们将获得它包含为DataFrames的表的列表:
import pandas as pd
import requests

# Can use auth parameter for authenticated URLs
r = requests.get('https://en.wikipedia.org/wiki/Python_(programming_language)',
                 auth=('john''johnspassword'))
tables = pd.read_html(r.text)
print('Tables found:', len(tables))
df1 = tables[0]
print('First Table')
print(df1.head())
运行此代码将生成以下输出:
Tables found: 10
First Table
                0                                                  1
0             NaN                                                NaN
1        Paradigm  Multi-paradigm: functional, imperative, object...
2     Designed by                                   Guido van Rossum
3       Developer                         Python Software Foundation
4  First appeared                              1991; 29 years ago[1]
用Python的Pandas编写HTML表
我们已经成功地从HTML表中读取了数据。让我们在HTML文件中编写Pandas DataFrame。这可以通过使用 to_html() 方法来实现。
to_html() 采用要将数据导出到的文件的路径。如果不提供绝对路径,则会保存相对于当前目录的文件。
您可以将DataFrame导出到HTML表,如下所示:
import pandas as pd

df = pd.DataFrame({'A': [12], 'B': [34]})
df.to_html('write_html.html')
此代码将在当前目录中生成以下文件 write_html.html
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>A</th>
      <th>B</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>3</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>4</td>
    </tr>
  </tbody>
</table>
请注意,导出不是整个HTML文档,而是HTML表本身。
用Python的Pandas编写样式化的HTML表
如我们所见,默认情况下,表格边框为1,对齐方式正确,并且在 <th> 标记中也具有DataFrame索引。我们可以通过提供一些可选参数来更改此默认结构。
隐藏索引
如果我们不想在表输出中包括索引,可以在 to_html() 中设置 index = False
import pandas as pd

df = pd.DataFrame({'A': [12], 'B': [34]})
df.to_html('write_html.html', index=False)
此代码产生具有以下内容的 write_html.html 文件:
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>A</th>
      <th>B</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>3</td>
    </tr>
    <tr>
      <td>2</td>
      <td>4</td>
    </tr>
  </tbody>
</table>
更改表格边框
表格的默认边框是1像素。要更改此默认设置,我们可以将 border 参数设置为以像素为单位的值。
以下代码将边框更改为3个像素值:
import pandas as pd

df = pd.DataFrame({'A': [12], 'B': [34]})
df.to_html('write_html.html', border=3)
现在,生成的文件将表的 border 属性设置为“ 3”:
<table border="3" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>A</th>
      <th>B</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>3</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>4</td>
    </tr>
  </tbody>
</table>
对齐文字
默认情况下,表格的标题文本是右对齐的。我们使用 justify 参数更改此对齐方式。例如,执行 justify =“ center” 将添加 style =“ text-align:center;” <thead> 标记的 <tr> 标记中。
让我们尝试将标题文本对齐到中心并查看结果:
import pandas as pd

df = pd.DataFrame({'A': [1'AAA'], 'B': ['BBB'4]})
df.to_html('write_html.html', justify='center')

上面的代码创建的表如下所示:

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: center;">
      <th></th>
      <th>A</th>
      <th>B</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>BBB</td>
    </tr>
    <tr>
      <th>1</th>
      <td>AAA</td>
      <td>4</td>
    </tr>
  </tbody>
</table>
现在,表格标题的文本与中心对齐。
结论
在本教程中,我们学习了如何使用Pandas DataFrames导入和导出HTML表数据。我们从文件以及从网页URL加载HTML表数据。对于经过身份验证的URL,我们使用了请求模块来对站点数据进行身份验证和检索,然后将响应文本传递到 read_html() 函数中。
我们还使用 to_html() 函数将 Pandas DataFrame 编写为HTML文件。然后,我们通过传递一些可选参数(例如 index border justify )来对生成的表进行样式设置。这使得以呈现方式写入DataFrame的数据变得容易。


更多阅读








特别推荐





点击下方阅读原文加入社区会员