用 Pandas 读写网页中的 HTML 表格数据
Posted Python中文社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用 Pandas 读写网页中的 HTML 表格数据相关的知识,希望对你有一定的参考价值。
<table>
标签来呈现表格数据。Pandas 数据分析库提供了
read_html()
和
to_html()
之类的功能,因此我们可以将数据导入和导出到DataFrames。
read_html()
函数读取HTML文件的表。此函数将HTML文件的表作为Pandas DataFrames读取。它可以从文件或URL中读取。
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>
read_html()
函数正常工作,您需要安装lxml:
$ pip install lxml
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)
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
read_html()
将HTML网页中的表元素读取到DataFrame中。我们将提供以下URL:
read_html('https://en.wikipedia.org/wiki/Python_(programming_language)')
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]
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 401: UNAUTHORIZED
$ pip install requests
get()
方法向网站URL发出请求,同时提供可选的
auth
参数。
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"
}
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]
to_html()
方法来实现。
to_html()
采用要将数据导出到的文件的路径。如果不提供绝对路径,则会保存相对于当前目录的文件。
import pandas as pd
df = 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>
<th>
标记中也具有DataFrame索引。我们可以通过提供一些可选参数来更改此默认结构。
to_html()
中设置
index = False
:
import pandas as pd
df = 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>
border
参数设置为以像素为单位的值。
import pandas as pd
df = 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 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>
read_html()
函数中。
to_html()
函数将 Pandas DataFrame 编写为HTML文件。然后,我们通过传递一些可选参数(例如
index
,
border
和
justify
)来对生成的表进行样式设置。这使得以呈现方式写入DataFrame的数据变得容易。
更多阅读
特别推荐
点击下方阅读原文加入社区会员
以上是关于用 Pandas 读写网页中的 HTML 表格数据的主要内容,如果未能解决你的问题,请参考以下文章
Python多进程爬虫东方财富盘口异动数据+Python读写Mysql与Pandas读写Mysql效率对比