Ошибка атрибута для строк, созданных из списков - PullRequest
0 голосов
/ 09 февраля 2011

Я пытаюсь создать файл очистки данных для класса, и данные, которые мне нужно обработать, требуют использования циклов while для получения нужных данных в отдельные массивы - т.е. для состояний, средних значений SAT и т. Д..

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

Ошибка атрибута: у объекта 'NoneType' нет атрибута '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)

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

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

1 Ответ

1 голос
/ 09 февраля 2011

Похоже, что поиск по регулярному выражению завершается с ошибкой (одной из) строк, поэтому он возвращает 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]. Первый более явный.

...