如何使用熊猫从文件中提取 html 表?

Posted

技术标签:

【中文标题】如何使用熊猫从文件中提取 html 表?【英文标题】:How to extract html tables from files, using pandas? 【发布时间】:2021-01-15 11:01:47 【问题描述】:

我是 pandas 的新手,我正在尝试从一些 html 文件中提取一些数据。

如何转换多个如下所示的 HTML 表格:

       PS4
Game Name | Price
GoW       | 49.99
FF VII R  | 59.99

       XBX
Game Name | Price
Gears 5   | 49.99
Forza 5   | 59.99
<table>
  <tr colspan="2">
    <td>PS4</td>
  </tr>
  <tr>
    <td>Game Name</td>
    <td>Price</td>
  </tr>
  <tr>
    <td>GoW</td>
    <td>49.99</td>
  </tr>
  <tr>
    <td>FF VII R</td>
    <td>59.99</td>
  </tr>
</table>

<table>
  <tr colspan="2">
    <td>XBX</td>
  </tr>
  <tr>
    <td>Game Name</td>
    <td>Price</td>
  </tr>
  <tr>
    <td>Gears 5</td>
    <td>49.99</td>
  </tr>
  <tr>
    <td>Forza 5</td>
    <td>59.99</td>
  </tr>
</table>

到这样的 json 对象中:

[
   "Game Name": "Gow", "Price": "49.99", "platform": "PS4",
   "Game Name": "FF VII R", "Price": "59.99", "platform": "PS4",
   "Game Name": "Gears 5", "Price": "49.99", "platform": "XBX",
   "Game Name": "Forza 5", "Price": "59.99", "platform": "XBX"
]

我尝试使用 pandas.read_html(path/to/file) 加载包含表格的 html 文件,它确实返回了一个 DataFrames 列表,但我不知道之后如何提取数据,尤其是平台名称在标题中,而不是单独的列。

我使用 pandas 是因为我从本地 htm 文件中提取这些表格,这些文件包含其他形式的表格和 HTML 代码,所以我使用:

tables = pandas.read_html(file_path, match="Game Name")

使用基于该列名称的匹配参数快速隔离我需要的表。

【问题讨论】:

【参考方案1】:
import pandas as pd

# list to save all dataframe from all tables in all files
df_list = list()

# list of files to load
list_of_files = ['test.html']

# iterate through your files
for file in list_of_files:
    
    # create a list of dataframes from the tables in the file
    dfl = pd.read_html(file, match='Game Name')
    
    # fix the headers and columns
    for d in dfl:

        # select row 1 as the headers
        d.columns = d.iloc[1]

        # select row 0, column 0 as the platform
        d['platform'] = d.iloc[0, 0]

        # selection row 2 and below as the data, row 0 and 1 were the headers
        d = d.iloc[2:]

        # append the cleaned dataframe to df_list
        df_list.append(d.copy())
        
# create a single dataframe
df = pd.concat(df_list).reset_index(drop=True)

# create a list of dicts from df
records = df.to_dict('records')

print(records)
[out]:
['Game Name': 'GoW', 'Price': '49.99', 'platform': 'PS4',
 'Game Name': 'FF VII R', 'Price': '59.99', 'platform': 'PS4',
 'Game Name': 'Gears 5', 'Price': '49.99', 'platform': 'XBX',
 'Game Name': 'Forza 5', 'Price': '59.99', 'platform': 'XBX']

【讨论】:

感谢您的回答和代码中的 cmets,这对理解它有很大帮助。

以上是关于如何使用熊猫从文件中提取 html 表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用熊猫提取数据矩阵?

如何从字典列表中提取数据到熊猫数据框中?

如何使用正则表达式从熊猫数据框中的一行中的字符串中提取所有特定值?

如何从字符串中提取熊猫索引的属性

如何从熊猫数据框中提取日期/年份/月份?

如何使用 php 从 HTML 表中提取数据