将HTML表格解析为Python列表?

69 投票
4 回答
165340 浏览
提问于 2025-04-16 19:26

我想把一个HTML表格解析成一个字典列表。每个列表里的元素都是一个字典,代表表格中的一行。

举个例子,如果我有一个包含三列的HTML表格(用标题标签标记),分别是“事件”、“开始日期”和“结束日期”,而这个表格有5条记录,我想解析这个表格,得到一个长度为5的列表,每个元素都是一个字典,字典里有“事件”、“开始日期”和“结束日期”这几个键。

谢谢大家的帮助!

4 个回答

35

Sven Marnach 提供的这个很棒的解决方案可以直接用在 ElementTree 上,这个工具是最近的 Python 版本里自带的:

from xml.etree import ElementTree as ET

s = """<table>
  <tr><th>Event</th><th>Start Date</th><th>End Date</th></tr>
  <tr><td>a</td><td>b</td><td>c</td></tr>
  <tr><td>d</td><td>e</td><td>f</td></tr>
  <tr><td>g</td><td>h</td><td>i</td></tr>
</table>
"""

table = ET.XML(s)
rows = iter(table)
headers = [col.text for col in next(rows)]
for row in rows:
    values = [col.text for col in row]
    print(dict(zip(headers, values)))

输出结果和 Sven Marnach 的回答是一样的...

75

解析HTML表格最简单的方法就是使用 pandas.read_html() 这个函数,它可以处理网址和HTML内容。

import pandas as pd
url = r'https://en.wikipedia.org/wiki/List_of_S%26P_500_companies'
tables = pd.read_html(url) # Returns list of all tables on page
sp500_table = tables[0] # Select table of interest

从pandas 1.5.0版本开始,read_html() 这个函数可以通过 extract_links 参数来保留超链接。这样,表格中的元素会变成元组。

87

你应该使用一些HTML解析库,比如lxml

from lxml import etree
s = """<table>
  <tr><th>Event</th><th>Start Date</th><th>End Date</th></tr>
  <tr><td>a</td><td>b</td><td>c</td></tr>
  <tr><td>d</td><td>e</td><td>f</td></tr>
  <tr><td>g</td><td>h</td><td>i</td></tr>
</table>
"""
table = etree.HTML(s).find("body/table")
rows = iter(table)
headers = [col.text for col in next(rows)]
for row in rows:
    values = [col.text for col in row]
    print dict(zip(headers, values))

打印输出

{'End Date': 'c', 'Start Date': 'b', 'Event': 'a'}
{'End Date': 'f', 'Start Date': 'e', 'Event': 'd'}
{'End Date': 'i', 'Start Date': 'h', 'Event': 'g'}

撰写回答