我通过使用beautifulsoup这样获得html表。
alltable = bt.find_all('table')
print(alltable)
它显示这样的输出。
[<table>
<thead>
<tr><th>ID</th><th>Name</th><th>User</th></tr>
</thead>
<tbody>
<tr valign="TOP">
<td><a href="/printers/PDF">PDF</a>-1 </td>
<td>Test </td>
<td>User1 </td>
</tr>
<tr valign="TOP">
<td><a href="/printers/PDF">PDF</a>-2 </td>
<td>Test </td>
<td>User1 </td>
</tr>
<tr valign="TOP">
<td><a href="/printers/PDF">PDF</a>-3 </td>
<td>Document1 </td>
<td>User1 </td>
</tr>
</tbody>
</table>]
我将html表读取到数据框并像这样打印。
df = pd.read_html(str(alltable))
print(df['Name'])
它显示这样的错误。
TypeError: list indices must be integers or slices, not str
如何修复?
答案 0 :(得分:1)
Panda's read_html返回DataFrame对象的列表-而不是单个DataFrame对象。就您而言,您需要索引到列表的唯一元素:
>>> df[0]['Name']
0 Test
1 Test
2 Document1
Name: Name, dtype: object
答案 1 :(得分:0)
此pd.read_html()函数搜索表元素,并且仅搜索表中每个(tr)或(th)元素内的(tr)和(th)行以及(td)元素。 td代表“表格数据”。
此函数将始终返回DataFrame对象的列表,否则将失败。
(这里是这种情况,因为当pd.read_html需要df对象列表时,您使用df ['Name']调用单个Dataframe对象。)
因此问题是您正在使用df ['Name']调用单个Dataframe对象,并且需要在第一个位置[0]索引该元素,该位置应包含现有Dataframe对象的列表。
替换
df['Name'] #only accessing a single Pandas Dataframe object
使用
df[0]['Name'] # Now indexing first position/element to uncover list of db objects
这将是pd.read_html唯一可以成功返回第一个索引位置[0]的数据帧对象列表的地方。
希望这会有所帮助。这里是熊猫pd.read_html()函数的文档链接。 https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.read_html.html