我正在尝试使用BeautifulSoup从HTML文档中的表中获取信息并放入数据框中。我写了以下代码:
driver.quit()
它出现以下错误:
from bs4 import BeautifulSoup
from nltk.corpus import wordnet as wn
import pandas as pd
filename = input('Please enter HTML filename: ')
with open(filename, encoding = "UTF-8") as f_input:
html = f_input.read()
f = BeautifulSoup(html, "html.parser")
table = f.find_all("table")
n_columns = 0
n_rows = 0
column_names = []
for row in table.find_all('tr'):
td_tags = row.find_all('td')
if len(td_tags)>0:
n_rows+=1
if n_columns == 0:
n_columns = len(td_tags)
th_tags = row.find_all('th')
if len(th_tags) > 0 and len(column_names) ==0:
for th in th_tags:
column_names.append(th.get_text())
if len(column_names) > 0 and len(column_names) != n_columns:
raise Exception("Column titles do not match the number of columns")
columns = column_names if len(column_names)> 0 else range(0,n_columns)
df = pd.DataFrame(columns = columns,
index=range(0,n_rows))
row_marker = 0
for row in table.find_all('tr'):
column_marker = 0
columns = row.find_all('td')
for column in columns:
df.iat[row_marker,column_marker] = column.get_text()
column_marker += 1
if len(columns)>0:
row_marker += 1
for col in df:
try:
df[col]=df[col].astype(float)
except ValueError:
pass
return df
我已经四处阅读,但我仍然不明白我做错了什么。我不认为我应该使用AttributeError: ResultSet object has no attribute 'find_all'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?
。任何人都可以帮忙解释一下吗?
答案 0 :(得分:0)
您的错误在此行th_tags = row.find_all('th')
。 row
未定义,因为它不在上层for循环中。
答案 1 :(得分:0)
我相信你的错误来自以下几行: table = f.find_all(“table”) ... 对于table.find_all('tr')中的行:
请注意,table现在是一个包含表格的元素集(在某些方面类似于列表)。如果只有一个表,则可以使用表[0]或在第一次调用中使用find而不是find_all来访问它。 如果页面中有多个表,或者您的表可能不是第一个表,那么您可能需要深入了解该集,并查看您的表是否具有唯一标识它的表。