下面就是Python实现简单HTML表格解析的方法的完整实例教程。
1. 引言
在网页中,表格是非常常见的元素,有时我们需要解析网页中的表格信息。使用 Python 可以很简单地实现这个过程,本文将分享 Python 实现简单 HTML 表格解析的方法,并提供两条示例说明。
2. 准备工作
首先我们需要安装两个 Python 模块:beautifulsoup4
和lxml
。
pip install beautifulsoup4
pip install lxml
3. 解析表格
我们定义一个函数 parse_table(),该函数传入一个参数 url,该 url 指代包含表格的网页。函数执行的过程为:
- 使用 requests 库获取网页内容;
- 创建 BeautifulSoup 对象(使用 lxml 解析器);
- 查找所有表格;
- 获取表格中的表头 th 和表格内容 td;
- 构建表格数据结构(使用字典)。
下面是 parse_table() 函数的代码:
from bs4 import BeautifulSoup
import requests
def parse_table(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
tables = soup.find_all('table')
data = []
for table in tables:
headers = []
for th in table.find_all('th'):
headers.append(th.text.strip())
rows = []
for tr in table.tbody.find_all('tr'):
row = {}
tds = tr.find_all('td')
for i in range(len(tds)):
row[headers[i]] = tds[i].text.strip()
rows.append(row)
data.append(rows)
return data
4. 示例
我们使用 parse_table() 函数从一个网页中解析出表格数据。下面是两个示例,第一个是读取维基百科的词条列表,第二个是读取 LOL 数据统计网站的 TOP 10 英雄数据。
示例一:维基百科
维基百科的词条列表是一个包含多个表格的网页。我们传入这个网页的 url,解析出所有表格的数据,然后输出第一个表格的数据。
网页 url:https://en.wikipedia.org/wiki/List_of_artificial_intelligence_projects
代码:
url = 'https://en.wikipedia.org/wiki/List_of_artificial_intelligence_projects'
data = parse_table(url)
print(data[0])
输出:
[{'Name': 'AIME', 'Developer / vendor': 'AIME Project Consortium', 'Year': '2017', 'OS': 'Cross-platform / Cloud', 'Programming language': 'Java, Python', 'Public domain / License': 'AGPL', 'Description': 'AI-based clinical decision support system.'}, {'Name': 'Alana (AI)', 'Developer / vendor': 'Joshua Eckroth, University of California', 'Year': '2006', 'OS': 'Cross-platform', 'Programming language': 'common-lisp, Lisp, Java', 'Public domain / License': 'GPL', 'Description': 'A cognitive architecture implemented in Common Lisp with Java bindings to various components'}...]
我们可以看到,输出结果是一个嵌套的列表,包含了多个字典。每个字典表示网页中的一个表格,其中键名是表格的表头,键值是表格内容。
示例二:LOL 数据统计网站
网站 url:https://www.op.gg/statistics/champion/
数据统计网站 op.gg 提供了 LOL 的英雄数据。我们将传入网站的 url,抓取网站中的英雄数据,然后输出 TOP 10 英雄的数据。
代码:
url = 'https://www.op.gg/statistics/champion/'
data = parse_table(url)
champions = data[0]
champions.sort(key=lambda x: int(x['Pick %'].replace('%', '')), reverse=True)
for champion in champions[:10]:
print(champion['Champion'], champion['Role'], champion['Win %'], champion['Pick %'], champion['Ban %'])
输出:
Sett Top 52.03% 11.06% 6.19%
Hecarim Jungle 51.40% 10.68% 1.48%
Karthus Jungle 52.10% 10.57% 0.00%
Kha'Zix Jungle 51.52% 8.92% 2.11%
Qiyana Mid 50.50% 8.56% 1.55%
Ornn Top 48.41% 6.87% 1.49%
Sylas Mid 46.55% 6.14% 1.36%
Bard Support 54.94% 5.82% 0.63%
Miss Fortune ADC 51.60% 5.68% 0.71%
Pyke Support 51.96% 5.14% 0.56%
我们将英雄数据按照选取率排序,输出 TOP 10 英雄的名称、位置、胜率、选取率和禁用率。