2017-01-12 3 views
-2

Вот мой код:NoneType Ошибка при попытке разобрать таблицы с использованием BeautifulSoup

source = urllib.request.urlopen('http://nflcombineresults.com/nflcombinedata_expanded.php ?year=2015&pos=&college=').read() 
soup = bs.BeautifulSoup(source, 'lxml') 

table = soup.table 
table = soup.find(id='datatable') 
table_rows = table.find_all('tr') 
#print(table_rows) 

year = [] 
name = [] 
college = [] 
pos = [] 
height = [] 
weight = [] 
hand_size = [] 
arm_length = [] 
wonderlic = [] 
fortyyrd = [] 

for row in table_rows[1:]: 
    col = row.find_all('td') 
    #row = [i.text for i in td] 
    #print(col[4]) 

    # Create a variable of the string inside each <td> tag pair, 
    column_1 = col[0].string.strip() 
    # and append it to each variable 
    year.append(column_1) 

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

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

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

    #print(col[4]) 
    column_5 = col[4].string.strip() 
    height.append(column_5) 

Есть еще несколько столбцов в таблице, я хочу добавить, но всякий раз, когда я пытаюсь запустить эти две последние строки, я получаю ошибка: «AttributeError: объект« NoneType »не имеет атрибута« strip ».

при печати седловины [4] прямо выше этой линии, я получаю:

<td><div align="center">69</div></td> 

Первоначально я думал, что это из-за отсутствия данных, но первый экземпляр недостающих данных в исходной таблице на сайте находится в 9-й колонке (Wonderlic) первой строки, а не в четвертом столбце.

Существует несколько других столбцов, не включенных в этот фрагмент кода, который я хочу добавить в свою фреймворк данных, и я получаю с ними ошибку NoneType, несмотря на то, что в этой ячейке есть запись.

Я довольно новичок в разборе таблиц с сайта с помощью BeautifulSoup, и поэтому это может быть глупый вопрос, но почему этот объект NoneType, как я могу это исправить, поэтому я могу поместить эту таблицу в кадр данных pandas?

+0

является местом генерации динамически JavasScript? Можете ли вы указать используемый URL? – user2915097

+0

Здесь используется URL-адрес, http://nflcombineresults.com/nflcombinedata_expanded.php?year=2015&pos=&college= –

ответ

1

AttributeError: 'NoneType' object has no attribute 'strip'

Фактическая ошибка происходит на последней строке таблицы, которая имеет одну ячейку, вот это HTML:

<tr style="background-color:#333333;"><td colspan="15">&nbsp;</td></tr> 

Просто крути:

for row in table_rows[1:-1]: 

Что касается улучшения общего качества кода, вы можете/должны следовать ответу @ 宏杰 李.

1
import requests 
from bs4 import BeautifulSoup 

r = requests.get('http://nflcombineresults.com/nflcombinedata_expanded.php?year=2015&pos=&college=') 
soup = BeautifulSoup(r.text, 'lxml') 
for tr in soup.table.find_all('tr'): 
    row = [td.text for td in tr.find_all('td')] 
    print (row) 

из:

['Year', 'Name', 'College', 'POS', 'Height (in)', 'Weight (lbs)', 'Hand Size (in)', 'Arm Length (in)', 'Wonderlic', '40 Yard', 'Bench Press', 'Vert Leap (in)', 'Broad Jump (in)', 'Shuttle', '3Cone', '60Yd Shuttle'] 
['2015', 'Ameer Abdullah', 'Nebraska', 'RB', '69', '205', '8.63', '30.00', '', '4.60', '24', '42.5', '130', '3.95', '6.79', '11.18'] 
['2015', 'Nelson Agholor', 'Southern California', 'WR', '73', '198', '9.25', '32.25', '', '4.42', '12', '', '', '', '', ''] 
['2015', 'Malcolm Agnew', 'Southern Illinois', 'RB', '70', '202', '', '', '', '*4.59', '', '', '', '', '', ''] 
['2015', 'Jay Ajayi', 'Boise State', 'RB', '73', '221', '10.00', '32.00', '24', '4.57', '19', '39.0', '121', '4.10', '7.10', '11.10'] 
['2015', 'Brandon Alexander', 'Central Florida', 'FS', '74', '195', '', '', '', '*4.59', '', '', '', '', '', ''] 
['2015', 'Kwon Alexander', 'Louisiana State', 'OLB', '73', '227', '9.25', '30.25', '', '4.55', '24', '36.0', '121', '4.20', '7.14', ''] 
['2015', 'Mario Alford', 'West Virginia', 'WR', '68', '180', '9.38', '31.25', '', '4.43', '13', '34.0', '121', '4.07', '6.64', '11.22'] 
['2015', 'Detric Allen', 'East Carolina', 'CB', '73', '200', '', '', '', '*4.59', '', '', '', '', '', ''] 
['2015', 'Javorius Allen', 'Southern California', 'RB', '73', '221', '9.38', '31.75', '12', '4.53', '11', '35.5', '121', '4.28', '6.96', ''] 

Как вы можете видеть, есть много пустых полей в таблице, лучший способ это поставить все поля в списке, а затем распаковать их или использовать namedtuple. Это улучшит стабильность вашего кода.

+0

[Только для кода ответы обычно некачественны] (http://meta.exechange.com/a/148274/219368). Пожалуйста, подумайте над тем, чтобы улучшить ответ (-ы), добавляя объяснения, ссылки на документацию, указывает, почему OP должен приближаться к нему таким образом, а не к другому. Благодарю. – alecxe

+0

@alecxe спасибо за указание, я улучшу свой ответ. –

1

В качестве альтернативы, если вы хотите попробовать его с пандами, вы можете сделать это так:

import pandas as pd 

df = pd.read_html("http://nflcombineresults.com/nflcombinedata_expanded.php?year=2015&pos=&college=")[0] 
df.head() 

Выход:

enter image description here

+0

Да, я пробовал делать это с помощью pandas, но я продолжал получать сообщение об ошибке: TypeError: ufunc 'add' не содержал цикл с подписями соответствия типов dtype ('

+0

Так рад, что нашел это.Я пытаюсь сделать то же самое с тем же самым сайтом ... такая же ошибка с Pandas. Пожелайте, чтобы это сработало, поскольку оно намного более компактно. Но я дам BeautifulSoup. Старался избежать этого. – chitown88

Смежные вопросы