2011-02-09 2 views
0

Я пытаюсь создать файл скремблирования данных для класса, а данные, которые я должен очистить, требуют, чтобы я использовал циклы для получения правильных данных в отдельные массивы, т. Е. Для состояния и средние САТ и т.д.Ошибка атрибута для строк, созданных из списков

Однако после того, как я создал петли в то время, мое регулярное выражение, которое расчистили большинство HTML-теги из данных сломалась, и я получаю сообщение об ошибке, что читает:

Attribute Error: 'NoneType' object has no attribute 'groups'

Мой код:

import re, util 
from BeautifulSoup import BeautifulStoneSoup 

# create a comma-delineated file 
delim = ", " 

#base url for sat data 
base = "http://www.usatoday.com/news/education/2007-08-28-sat-table_N.htm" 

#get webpage object for site 
soup = util.mysoupopen(base) 

#get column headings 
colCols = soup.findAll("td", {"class":"vaTextBold"}) 

#get data 
dataCols = soup.findAll("td", {"class":"vaText"}) 

#append data to cols 
for i in range(len(dataCols)): 
    colCols.append(dataCols[i]) 

#open a csv file to write the data to 
fob=open("sat.csv", 'a') 

#initiate the 5 arrays 
states = [] 
participate = [] 
math = [] 
read = [] 
write = [] 

#split into 5 lists for each row 
for i in range(len(colCols)): 
    if i%5 == 0: 
     states.append(colCols[i]) 
i=1 
while i<=250: 
    participate.append(colCols[i]) 
    i = i+5 

i=2 
while i<=250: 
    math.append(colCols[i]) 
    i = i+5 

i=3 
while i<=250: 
    read.append(colCols[i]) 
    i = i+5 

i=4 
while i<=250: 
    write.append(colCols[i]) 
    i = i+5 

#write data to the file 
for i in range(len(states)): 
    states = str(states[i]) 
    participate = str(participate[i]) 
    math = str(math[i]) 
    read = str(read[i]) 
    write = str(write[i]) 

    #regex to remove html from data scraped 

    #remove <td> tags 
    line = re.search(">(.*)<", states).groups()[0] + delim + re.search(">(.*)<",  participate).groups()[0]+ delim + re.search(">(.*)<", math).groups()[0] + delim + re.search(">(.*)<", read).groups()[0] + delim + re.search(">(.*)<", write).groups()[0] 

    #append data point to the file 
    fob.write(line) 

Любые идеи относительно того, почему эта ошибка внезапно появилась? Регулярное выражение работало нормально, пока я не попытался разделить данные на разные списки. Я уже пробовал печатать различные строки в финальном цикле «для», чтобы увидеть, было ли какое-либо из них «Нет» для первого значения i (0), но они были всей строкой, которую они должны были быть.

Любая помощь была бы принята с благодарностью!

ответ

1

Похоже, поиск в регулярном выражении терпит неудачу (одна из) строк, поэтому он возвращает None вместо MatchObject.

Попробуйте следующий вместо очень длинной #remove <td> tags линии:

out_list = [] 
for item in (states, participate, math, read, write): 
    try: 
     out_list.append(re.search(">(.*)<", item).groups()[0]) 
    except AttributeError: 
     print "Regex match failed on", item 
     sys.exit() 
line = delim.join(out_list) 

Таким образом, вы можете узнать, где ваше регулярное выражение не удается.

Кроме того, я предлагаю использовать .group(1) вместо .groups()[0]. Первый более явный.

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