使用BeautifulSoup从html表获取信息时出错

时间:2018-04-19 16:00:39

标签: python html beautifulsoup

我正在尝试使用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()? 。任何人都可以帮忙解释一下吗?

2 个答案:

答案 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来访问它。 如果页面中有多个表,或者您的表可能不是第一个表,那么您可能需要深入了解该集,并查看您的表是否具有唯一标识它的表。