熊猫read_html:如何读取包含的列?

时间:2018-10-05 10:31:00

标签: html pandas

我正在尝试使用python读取html表,如下所示:

+------------+---------+
|    ID      | Value   |
+------------+---------+
| 1          | 12 098  |
| 2          |     20  |
| 3          | 123 456 |
+------------+---------+

在html代码中,元素如下所示:

<span> 123&nbsp;456</span>

Pandas将此作为对象读取,但我需要将其数字化。我尝试过:

df_tables=pd.read_html(table_html,header=0,thousands='&nbsp;')

 df_tables=pd.read_html(table_html,header=0,thousands=' ')

但是该列始终是“对象”。

我尝试过强制浮动:

df_table['Value']=df_table['Value'].apply(pd.to_numeric,errors='coerce')

但这只是删除了空格中的列中的值。

随后,我尝试在应用于数字之前从列中去除空格:

df_table=df_table['Value'].map(lambda x: x.strip(' '))

但这似乎没有任何效果。我更愿意在阅读html时解决此问题,但我很乐意接受目前可以为我提供数值列的任何解决方案。

更新

我无法从源html中删除&nbsp;,因为还有其他包含文本的列。

2 个答案:

答案 0 :(得分:0)

尝试使用:

df_table['Value'] = df_table['Value'].str.replace('\D', '').astype(int)

答案 1 :(得分:0)

另一种解决方法

import pandas as pd

html_string = """
<table>
  <thead>
    <tr>
      <th>ID</th>
      <th>value</th> 
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>1&nbsp;230</td> 
    </tr>
    <tr>
      <td>2</td>
      <td>100</td> 
    </tr>
    <tr>
      <td>3</td>
      <td>220</td> 
    </tr>
  </tbody>
</table>
"""

html_string = html_string.replace("&nbsp;","")

df_table = pd.read_html(html_string)
dfs = df_table[0]

for (index, row) in dfs.iterrows():
    print(float(row[1]))