2014-06-08 2 views
19

Sto cercando di raschiare un semplice tavolo usando Beautiful Soup. Ecco il mio codice:Beautiful Soup: l'oggetto 'ResultSet' non ha attributo 'find_all'?

import requests 
from bs4 import BeautifulSoup 

url = 'https://gist.githubusercontent.com/anonymous/c8eedd8bf41098a8940b/raw/c7e01a76d753f6e8700b54821e26ee5dde3199ab/gistfile1.txt' 
r = requests.get(url) 

soup = BeautifulSoup(r.text) 
table = soup.find_all(class_='dataframe') 

first_name = [] 
last_name = [] 
age = [] 
preTestScore = [] 
postTestScore = [] 

for row in table.find_all('tr'): 
    col = table.find_all('td') 

    column_1 = col[0].string.strip() 
    first_name.append(column_1) 

    column_2 = col[1].string.strip() 
    last_name.append(column_2) 

    column_3 = col[2].string.strip() 
    age.append(column_3) 

    column_4 = col[3].string.strip() 
    preTestScore.append(column_4) 

    column_5 = col[4].string.strip() 
    postTestScore.append(column_5) 

columns = {'first_name': first_name, 'last_name': last_name, 'age': age, 'preTestScore': preTestScore, 'postTestScore': postTestScore} 
df = pd.DataFrame(columns) 
df 

Tuttavia, ogni volta ho eseguito, ottengo questo errore:

--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-116-a900c2872793> in <module>() 
    14 postTestScore = [] 
    15 
---> 16 for row in table.find_all('tr'): 
    17  col = table.find_all('td') 
    18 

AttributeError: 'ResultSet' object has no attribute 'find_all' 

Ho letto in giro domande una dozzina di StackOverflow su questo errore, e non riesco a capire cosa mi sto sbagliando.

+0

Sarebbe utile se avete dato il * traceback completo * quando si dispone di un sacco di '.find_all's presente e non tutti vogliono/può eseguire questo codice per scoprirlo da solo ... –

+0

Siamo spiacenti. Ho modificato il post – Anton

risposta

9
table = soup.find_all(class_='dataframe') 

Questo vi dà un set di risultati - vale a dire tutte gli elementi che corrispondono alla classe. È possibile eseguire iterazioni su di essi o, se si sa che si dispone solo di uno dataFrame, è possibile utilizzare invece find. Dal codice sembra che il secondo è quello che ti serve, per affrontare il problema immediato:

table = soup.find(class_='dataframe') 

Tuttavia, questo non è tutto:

for row in table.find_all('tr'): 
    col = table.find_all('td') 

Probabilmente si desidera per scorrere i td s in la fila qui, piuttosto che l'intero tavolo. (In caso contrario, si vede solo la prima riga più e più volte.)

for row in table.find_all('tr'): 
    for col in row.find_all('td'): 
26

La variabile table contiene una matrice. Dovresti chiamare lo find_all sui suoi membri (anche se sai che è un array con un solo membro), non sull'intera cosa.

>>> type(table) 
<class 'bs4.element.ResultSet'> 
>>> type(table[0]) 
<class 'bs4.element.Tag'> 
>>> len(table[0].find_all('tr')) 
6 
>>> 
1

iterare tavolo e utilizzare rowfind_all('td')

for row in table: 
     col = row.find_all('td')