Python实现简单HTML表格解析的方法

  • Post category:Python

下面就是Python实现简单HTML表格解析的方法的完整实例教程。

1. 引言

在网页中,表格是非常常见的元素,有时我们需要解析网页中的表格信息。使用 Python 可以很简单地实现这个过程,本文将分享 Python 实现简单 HTML 表格解析的方法,并提供两条示例说明。

2. 准备工作

首先我们需要安装两个 Python 模块:beautifulsoup4lxml

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 英雄的名称、位置、胜率、选取率和禁用率。