介绍

超文本标记语言(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 pdtables = 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 df2print('First Table')
print(df1)
print('Another Table')
print(df2)

注意:虽然您需要安装lxml,但无需将其导入程序中即可使Pandas正常工作。

在Python解释器上运行以上代码将产生以下输出:

Tables found: 2
First TableProgramming Language             Creator  Year
0                    C      Dennis Ritchie  1972
1               Python    Guido Van Rossum  1989
2                 Ruby  Yukihiro Matsumoto  1995
Another TableArea (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 pdtables = 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 Table0                                                  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 requestsr = 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 Table0                                                  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 pddf = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
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 pddf = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
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 pddf = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
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 pddf = 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文件。然后,我们通过传递一些可选参数(例如indexborderjustify)来对生成的表进行样式设置。这使得以呈现方式写入DataFrame的数据变得容易。

更多阅读

5分钟掌握在 Cython 中使用 C++

5 分钟掌握 Python 中常见的配置文件

5 分钟掌握 Python 中的 Hook 钩子函数

特别推荐

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

用 Pandas 读写网页中的 HTML 表格数据相关推荐

  1. html 表格是网页中的数据,用 Pandas 读写网页中的 HTML 表格数据

    介绍超文本标记语言(HTML)是用于构建网页的标准标记语言.我们可以使用HTML的 Programming LanguageCreatorYear CDennis Ritchie1972PythonG ...

  2. php中表格的美化,美化网页中的Table表格样式 - 文章教程

    Table表格曾经是网页布局的霸主,可惜现在用的少了,主要还是用在表现表格结构化数据的布局,虽说用得少,但是表格用起来还是很方便的,至少有时候比DIV+CSS更方便,关于如何美化网页中的Table表格 ...

  3. JS实现网页中绘制10x10表格,并在其中区分1-100素数合数。

    JS实现网页中绘制10x10表格,并在其中区分1-100素数合数. 一:需求 在网页中绘制10x10的表格,并在其中区分1-100素数和合数 二:解决思路 创建一个判断素数合素的的函数: 创建一个函数 ...

  4. python抓取表格数据_Python如何实现从PDF文件中爬取表格数据(代码示例)

    本篇文章给大家带来的内容是关于Python如何实现从PDF文件中爬取表格数据(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 本文将展示一个稍微不一样点的爬虫. 以往我们的 ...

  5. Python抓取网页中的动态序列化数据

    Python抓取网页中的动态序列化数据 动态序列化数据经常应用于前后端分离的页面.或者通过VUE.JS等HTML页面环境,常规的爬虫抓取方法并不能满足数据采集的要求,因此需要其他的方式进行数据的采集. ...

  6. pandas使用read_excel函数读取excel表格数据为dataframe、设置sheet_name参数为表单索引位置列表则读取多个表单的数据并返回dataframe字典

    pandas使用read_excel函数读取excel表格数据为dataframe.使用sheet_name参数指定读取excel表格中指定的sheet表单.设置sheet_name参数为表单索引位置 ...

  7. 利用正则表达式提取网页中Table内的数据

    利用正则表达式提取网页中Table内的数据 using System; using System.Collections.Generic; using System.Linq; using Syste ...

  8. Matlab中读取excel表格数据

    一:Matlab中读取excel表格数据步骤讲解: 第二步:  第三步:  第四步:  第五步:  第六步    第七步:  输入之后按回车键,就会出现相应的波形: 效果图:

  9. java 操作 word 表格和样式,java读取word表格中的表格 java如何读取word中的excel表格数据...

    Java 利用poi 可以直接读取word中的表格保持样式生1.读取word 2003及word 2007需要的jar包 读取 2003 版本(.doc)的word文件相对来说比较简单,只需要 poi ...

最新文章

  1. java 泛型集合 json_将泛型集合转换成分页json数据
  2. 企业邮箱自建,该如何选型测试
  3. 记实现TDengine时序数据库支持 .Net Windows 32位系统踩坑
  4. gif分解工具_Python之GIF图倒放,沙雕快乐源泉
  5. 常用css属性集(持续更新…)
  6. 【DB】部分MySQL操作记录
  7. 张孝祖的第一次作业展示
  8. 六个角度深层区分ERP和MES的不同!
  9. 设置java路径_关于java路径设置
  10. 《社会调查数据管理——基于Stata 14管理CGSS数据》一1.3 数据管理工作主体不明...
  11. AndroidOTA增量包(差分包)制作记录
  12. 数学中的圆周率符号怎么输入
  13. Apache Flink如何处理背压
  14. bzoj4399 魔法少女LJJ
  15. 全国关于省市区/县的行政区划数据-数据来源国家统计局
  16. android 高仿 猿题库,猿题库(com.fenbi.android.gaozhong) - 9.17.2 - 应用 - 酷安
  17. 数据结构与算法——23. 用嵌套列表与链表实现树结构
  18. 笔记本计算机的功率一般多少钱,笔记本功率一般是多少瓦
  19. Android AIDL 传递对象(Parceable),深度解读Netty
  20. 2022年全球市场车载麦克风总体规模、主要生产商、主要地区、产品和应用细分研究报告

热门文章

  1. 264Echarts - GL 路径图(Use linesGL to draw 1 million ny streets.)
  2. API接口之JWT设置token过期时间(二)
  3. 乔布斯的简历17.4万拍卖,HR看了想打人
  4. Telegram-“只能给双向联系人发送消息”的错误信息
  5. 音频焦点(AudioFocus)应用与源码解析
  6. Python 类的定制
  7. 苹果 iPhone4 ios7.0 无法下载应用程序 此时无法
  8. 微信公众平台服务器的官方示例代码,微信公众平台API接口(示例代码)
  9. 编程之美 之 程序理解和时间分析 与JOJ 2042
  10. Power query(Power BI) 自动生成贷款公司的还款计划表