2015-12-31 5 views
0

У меня возникли проблемы с добавлением чисел в связанном HTML-файле (суммирование).Не удается добавить вместе извлеченные целые числа из HTML-файла

Я получаю эту ошибку в данный момент:

Line 26 b=sum(y) typeError unsupported operand types for +: int and str 

Вот мой код

import urllib 
from BeautifulSoup import * 
import re 

counter = 0 
added = 0 


url = "http://python-data.dr-chuck.net/comments_42.html" 
html = urllib.urlopen(url).read() 

soup = BeautifulSoup(html) 

# Retrieve all of the span tags 
spans = soup('span') 

for comments in spans: 
    print comments 
    counter +=1 
    #y = re.findall('(\d+)', comments) -- didnt work 
    #print y 
    #added += y 
y = re.findall('(\d+)', str(soup)) 
print y 
b = sum(y) 
print b 

print "Count", counter 
print "Sum", added 

Мой желаемый результат что-то вроде:

Count: 50 
Sum: 2482 

Как вы можете видеть, где Я прокомментировал свой код - я попытался добавить их так или iginally. Не знаю, почему это не сработало.

#y = re.findall('(\d+)', comments) -- didnt work 
    #print y 
    #added += y 

Я также не знаю, почему это помещает найденные числа в списке

y = re.findall('(\d+)', str(soup)) 
+1

вы суммированием строк. Попробуйте с 'b = sum (map (int, y))' – Pynchia

+0

Итак, что случилось? Вы получили сообщение об ошибке? И работает ли 'b = sum (y)'? –

+0

@zetysz: Я знаю, но тогда OP получит ошибку в 'b = sum (y)'. Но OP только сказал, что он получил ошибку в части комментария. –

ответ

1

Вы пытаетесь подвести строки. Преобразование строк в целые числа перед суммированием, как сказал Пинчия, затем распечатать b as the Sum.

... 
b = sum(map(int, y)) 
... 
print "Count", counter 
print "Sum", b 

Если вы хотите, чтобы исправить использование комментарий часть:

... 
y = re.findall('(\d+)', str(comments)) 
print y 
added = sum(map(int, y)) 
1

Цитирование из Python Documentation:

re.findall(pattern, string, flags=0)

Возврат все неперекрывающиеся матчи шаблона в строке , в качестве список строк. Строка проверяется слева направо, а совпадения возвращаются в указанном порядке.

Если в шаблоне найдено: групп, список из ; это будет список кортежей, если шаблон имеет более одной группы . Пустые совпадения включаются в результат, если они не касаются начала другого матча.

Это выражение:

y = re.findall('(\d+)', str(soup)) возвращает список все строки сопоставления вашего шаблона (\d+) который является строкой цифр. Итак, у вас есть список строк.

Затем

b = sum(y), будет пытаться некоторых строк вместо целых чисел, поэтому вы получили это сообщение об ошибке.

Попробуйте вместо этого:

b = sum(map(int, y)), это будет преобразовывать каждую строку цифры в y к interger затем суммировать их все.

DEMO:

>>> s = 'Today is 31st, December, Temperature is 18 degC' 
>>> y = re.findall('(\d+)', s) 
['31', '18'] 
>>> b = sum(map(int, y)) 
>>> b 
49 
Смежные вопросы