HTML

1 读取 HTML 内容

顶级 read_html() 函数可以接受 HTML 字符串、文件或URL,并将 HTML 表解析为 pandas DataFrames 列表。

注意:即使 HTML 内容中仅包含一个表,read_html 也会返回 DataFrame 对象的列表

让我们看几个例子

In [295]: url = (

.....: "https://raw.githubusercontent.com/pandas-dev/pandas/master/"

.....: "pandas/tests/io/data/html/spam.html"

.....: )

.....:

In [296]: dfs = pd.read_html(url)

In [297]: dfs

Out[297]:

[ Nutrient Unit Value per 100.0g oz 1 NLEA serving 56g Unnamed: 4 Unnamed: 5

0 Proximates Proximates Proximates Proximates Proximates Proximates

1 Water g 51.70 28.95 NaN NaN

2 Energy kcal 315 176 NaN NaN

3 Protein g 13.40 7.50 NaN NaN

4 Total lipid (fat) g 26.60 14.90 NaN NaN

.. ... ... ... ... ... ...

32 Fatty acids, total monounsaturated g 13.505 7.563 NaN NaN

33 Fatty acids, total polyunsaturated g 2.019 1.131 NaN NaN

34 Cholesterol mg 71 40 NaN NaN

35 Other Other Other Other Other Other

36 Caffeine mg 0 0 NaN NaN

[37 rows x 6 columns]]

读入 banklist.html 文件的内容,并将其作为字符串传递给 read_html

In [298]: with open(file_path, "r") as f:

.....: dfs = pd.read_html(f.read())

.....:

In [299]: dfs

Out[299]:

[ Bank Name City ... Closing Date Updated Date

0 Banks of Wisconsin d/b/a Bank of Kenosha Kenosha ... May 31, 2013 May 31, 2013

1 Central Arizona Bank Scottsdale ... May 14, 2013 May 20, 2013

2 Sunrise Bank Valdosta ... May 10, 2013 May 21, 2013

3 Pisgah Community Bank Asheville ... May 10, 2013 May 14, 2013

4 Douglas County Bank Douglasville ... April 26, 2013 May 16, 2013

.. ... ... ... ... ...

500 Superior Bank, FSB Hinsdale ... July 27, 2001 June 5, 2012

501 Malta National Bank Malta ... May 3, 2001 November 18, 2002

502 First Alliance Bank & Trust Co. Manchester ... February 2, 2001 February 18, 2003

503 National State Bank of Metropolis Metropolis ... December 14, 2000 March 17, 2005

504 Bank of Honolulu Honolulu ... October 13, 2000 March 17, 2005

[505 rows x 7 columns]]

如果愿意,您甚至可以传入 StringIO 的实例

In [300]: with open(file_path, "r") as f:

.....: sio = StringIO(f.read())

.....:

In [301]: dfs = pd.read_html(sio)

In [302]: dfs

Out[302]:

[ Bank Name City ... Closing Date Updated Date

0 Banks of Wisconsin d/b/a Bank of Kenosha Kenosha ... May 31, 2013 May 31, 2013

1 Central Arizona Bank Scottsdale ... May 14, 2013 May 20, 2013

2 Sunrise Bank Valdosta ... May 10, 2013 May 21, 2013

3 Pisgah Community Bank Asheville ... May 10, 2013 May 14, 2013

4 Douglas County Bank Douglasville ... April 26, 2013 May 16, 2013

.. ... ... ... ... ...

500 Superior Bank, FSB Hinsdale ... July 27, 2001 June 5, 2012

501 Malta National Bank Malta ... May 3, 2001 November 18, 2002

502 First Alliance Bank & Trust Co. Manchester ... February 2, 2001 February 18, 2003

503 National State Bank of Metropolis Metropolis ... December 14, 2000 March 17, 2005

504 Bank of Honolulu Honolulu ... October 13, 2000 March 17, 2005

[505 rows x 7 columns]]

读取 URL 并匹配包含特定文本的表

match = "Metcalf Bank"

df_list = pd.read_html(url, match=match)

指定一个标题行(默认情况下

或 位于 中的元素用于形成列索引,如果 中包含多个行,那么创建一个多索引)

dfs = pd.read_html(url, header=0)

指定索引列

dfs = pd.read_html(url, index_col=0)

指定要跳过的行数:

dfs = pd.read_html(url, skiprows=0)

使用列表指定要跳过的行数(range 函数也适用)

dfs = pd.read_html(url, skiprows=range(2))

指定一个 HTML 属性

dfs1 = pd.read_html(url, attrs={"id": "table"})

dfs2 = pd.read_html(url, attrs={"class": "sortable"})

print(np.array_equal(dfs1[0], dfs2[0])) # Should be True

指定应转换为 NaN 的值

dfs = pd.read_html(url, na_values=["No Acquirer"])

指定是否保持默认的 NaN 值集

dfs = pd.read_html(url, keep_default_na=False)

可以为列指定转换器。这对于具有前导零的数字文本数据很有用。

默认情况下,将数字列转换为数字类型,并且前导零会丢失。为了避免这种情况,我们可以将这些列转换为字符串

url_mcc = "https://en.wikipedia.org/wiki/Mobile_country_code"

dfs = pd.read_html(

url_mcc,

match="Telekom Albania",

header=0,

converters={"MNC": str},

)

组合上面的选项

dfs = pd.read_html(url, match="Metcalf Bank", index_col=0)

读取 to_html 的输出(会损失浮点数的精度)

df = pd.DataFrame(np.random.randn(2, 2))

s = df.to_html(float_format="{0:.40g}".format)

dfin = pd.read_html(s, index_col=0)

当只提供了一个解析器时,如果解析失败,lxml 解析器会抛出异常,最好的方式是指定一个解析器列表

dfs = pd.read_html(url, "Metcalf Bank", index_col=0, flavor=["lxml"])

# or

dfs = pd.read_html(url, "Metcalf Bank", index_col=0, flavor="lxml")

但是,如果安装了 bs4 和 html5lib 并传入 None 或 ['lxml','bs4'],则解析很可能会成功。

dfs = pd.read_html(url, "Metcalf Bank", index_col=0, flavor=["lxml", "bs4"])

2 写入 HTML 文件

DataFrame 对象有一个实例方法 to_html,它将 DataFrame 的内容呈现为 html 表格。

函数参数与上面描述的方法 to_string 相同。

In [303]: df = pd.DataFrame(np.random.randn(2, 2))

In [304]: df

Out[304]:

0 1

0 -0.184744 0.496971

1 -0.856240 1.857977

In [305]: print(df.to_html()) # raw html

01

0-0.1847440.4969711-0.8562401.857977

image.png

columns 参数将限制显示的列

In [306]: print(df.to_html(columns=[0]))

0

0-0.1847441-0.856240

image.png

float_format 参数控制浮点值的精度

In [307]: print(df.to_html(float_format="{0:.10f}".format))

01

0-0.18474385760.49697113271-0.85623967631.8579766508

image.png

bold_rows 默认情况下将使行标签加粗,但你可以关闭它

In [308]: print(df.to_html(bold_rows=False))

01

0-0.1847440.4969711-0.8562401.857977

image.png

classes 参数提供了给 HTML 表 设置 CSS 类的能力。

请注意,这些类附加到现有的 dataframe 类之后

In [309]: print(df.to_html(classes=["awesome_table_class", "even_more_awesome_class"]))

01

0-0.1847440.4969711-0.8562401.857977

render_links 参数提供了向包含 url 的单元格添加超链接的能力

In [310]: url_df = pd.DataFrame(

.....: {

.....: "name": ["Python", "pandas"],

.....: "url": ["https://www.python.org/", "https://pandas.pydata.org"],

.....: }

.....: )

.....:

In [311]: print(url_df.to_html(render_links=True))

nameurl

0Python https://www.python.org/1pandas https://pandas.pydata.org

image.png

最后,escape 参数允许您控制 HTML 结果中是否转义了 "" 和 "&" 字符(默认情况下为 True)。

因此,要获得没有转义字符的 HTML,请传递 escape=False

In [312]: df = pd.DataFrame({"a": list("&<>"), "b": np.random.randn(3)})

转义

In [313]: print(df.to_html())

ab

0&-0.4740631<-0.2303052>-0.400654

image.png

不转义

In [314]: print(df.to_html(escape=False))

ab

0&-0.4740631<-0.2303052>-0.400654

image.png

在某些浏览器上这两个 HTML 表可能并不会显示出差异。

3 HTML表解析技巧

在顶级 pandas io 函数 read_html 中,用于解析 HTML 表的库存在一些问题

lxml 的问题

优点

快速

依赖 Cython

缺点

lxml 对其解析结果不做任何保证,除非为其提供严格有效的标记。可以选择使用 lxml 后端,但是如果 lxml 无法解析,则该后端将使用 html5lib

强烈建议您同时安装 BeautifulSoup4 和 html5lib,以便即使 lxml 失败,您仍将获得有效结果

使用 lxml 作为 BeautifulSoup4 后端的问题

因为 BeautifulSoup4 本质上只是解析器后端的封装,因此上述问题同样存在

使用 html5lib 作为 BeautifulSoup4 后端的问题

优点

html5lib 比 lxml 宽松得多,因此会以一种更理智的方式处理现实生活中的标记,而不仅仅是在不通知您的情况下删除一个元素

html5lib 自动从无效标记中生成有效的 HTML5 标记。这对于解析 HTML 表非常重要,因为它保证了一个有效的文档。然而,这并不意味着它一定是正确的,因为修复标记的过程并没有统一的定义

html5lib 是纯 Python 实现,不需要额外的构建步骤

缺点

使用 html5lib 的最大缺点是速度很慢

python读取html中的表格数据_Python 数据处理(十八)—— HTML 表格相关推荐

  1. python读取url中存储的数据_Python实现从URL地址提取文件名的方法

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  2. python读取url中存储的数据_python 给定URL 如何获取其内容,并将其保存至HTML文档。...

    获取URL的内容需要用到标准库urllib包,其中的request模块. import urllib.request url='http://www.baidu.com' response=urlli ...

  3. python读取序列5之后的数据_Python 基本功: 5. 数据序列化

    这篇文章紧接着前篇:多多教Python:Python 基本功: 4. 读写文件​zhuanlan.zhihu.com 仔细阅读的小伙伴会发现,在基本功4 里最后的一个示例中,我们读取解析了文件中的内容 ...

  4. python读取excel日期和时间数据_python 在excel文件中写入date日期数据,以及读取excel日期数据,如何在python中正确显示date日期。...

    如何通过python写入date数据了? 写入还是很简单的. import xlwt3 import  datetime as dt workbook = xlwt.Workbook() worksh ...

  5. python比较excel中两列数据_python入门之对比两份excel表格数据

    今天老大交给我一个任务,对比两个版本的excel数据的异同(增删情况),唉,说多了都是泪,自从学会了python,再也不用担心老大这样的任务了~~~ 好了直接上代码吧,代码中解释 import xlr ...

  6. python 读取合并单元格的数据_Python使用xlrd实现读取合并单元格

    合并单元格 操作方法: 1.使用xlrd自带属性:merged_cells # 获取表格中所有合并单元格位置,以列表形式返回 (起始行,结束行,起始列,结束列) merged = sheet.merg ...

  7. python读取文本中的英文歌_Python 实例分析 - 获取MP3歌曲的Tag信息

    下面利用一个python的实例程序,来学习python.这个程序的目的就是分析出所有MP3文件的Tag信息并输出. 其中遇到一个问题,让我深切感受到python中依靠缩进来控制流程的缺点,不多说,看程 ...

  8. python 从excel中抓取数据_python接口自动化(三)——从excel中获取数据

    python接口自动化(三)--从excel中获取数据 1.按照之前的设计思路,我们需要从excel中去获取测试用例,所我们先封装一个获取数据的工具 from Data.with_config imp ...

  9. python读取序列5之后的数据_Python核心编程读笔 5: python的序列

    第六章 序列:字符串.列表.元组 一.序列 (1)序列类型操作符 seq[ind] 获得下标为 ind 的元素 seq[ind1:ind2] 切片操作 seq * expr 序列重复 expr 次 s ...

最新文章

  1. PingCode 是用来干嘛的?
  2. Scala父类和父特质的执行顺序
  3. 第2章-神经网络的数学基础(笔记)
  4. awx文件_如何在Minishift上运行AWX
  5. vs2010变的特别卡解决办法
  6. 统计自然语言处理基础——学习摘要(1)
  7. 代码实现Autolayout
  8. setContentView是如何把布局加上去的
  9. 解决AndroidStudio引入Jar出现Unable to resolve dependency for ':app@debug/compileClasspath
  10. Layui自定义表单校验规则
  11. 我的世界java版如何加披风_我的世界正版披风怎么换
  12. MFC弹出确认和取消对话框
  13. Ubuntu fastboot 烧写
  14. 简单手机短信发送软件
  15. 一个数据分析报告的框架,主要包含哪几项?
  16. UBUNTU上打字练习软件
  17. 一款模拟养成类游戏的策划大纲
  18. 通用后台管理系统前端界面
  19. 【PV操作】买面包的叫号算法(存疑)
  20. speex库音频降噪(含代码)

热门文章

  1. ASP.NET与IIS
  2. python soup歌词_Python 爬虫获取网易云音乐歌手的歌词
  3. 火星人的真实故事(3)
  4. 硬核“毕业证”:5 位本科生带自研处理器芯片毕业,包云岗解读“一生一芯”计划...
  5. 进制转换 二、八、十、十六进制。BDOH
  6. 视频网站使用H265编码能提高视频清晰度吗?
  7. 题解洛谷P2128(c++解法)赤壁之战
  8. Android电池健康,Android电池的健康状况如何确定?
  9. 前端Vue模板页面(组件最全)
  10. 4444444444