Вот мой код:

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'"

Когда я печатаю col [4] прямо над этой строкой, я получаю:

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

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

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

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

-2
Tyler Roberts 12 Янв 2017 в 19:01

3 ответа

Лучший ответ

AttributeError: у объекта 'NoneType' нет атрибута 'strip'

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

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

Просто нарежьте его :

for row in table_rows[1:-1]:

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

1
alecxe 12 Янв 2017 в 16:17
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. Это улучшит стабильность вашего кода.

1
宏杰李 13 Янв 2017 в 04:05

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

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

2
MYGz 12 Янв 2017 в 16:25