2016-12-26 72 views
0

我想从这个链接得到在“间距”标签:http://python-data.dr-chuck.net/comments_42.html从HTML标签获得数字

的数据是这样的:

<tr><td>Modu</td><td><span class="comments">90</span></td></tr> 
<tr><td>Kenzie</td><td><span class="comments">88</span></td></tr> 
<tr><td>Hubert</td><td><span class="comments">87</span></td></tr> 

下面的代码:

import urllib 
from BeautifulSoup import * 

url = raw_input('Enter - ') 
html = urllib.urlopen(url).read() 

soup = BeautifulSoup(html) 

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


numbers = [number.contents[0] for number in tags] 
print numbers 

当我打印numbers,它显示是这样的:

[u'97', u'97', u'90', u'90', u'88', u'87', u'87', u'80', u'79', u'79', u'78', u'76', u'76', u'72', u'72', u'66', u'66', u'65', u'65', u'64', u'61', u'61', u'59', u'58', u'57', u'57', u'54', u'51', u'49', u'47', u'40', u'38', u'37', u'36', u'36', u'32', u'25', u'24', u'22', u'21', u'19', u'18', u'18', u'14', u'12', u'12', u'9', u'7', u'3', u'2'] 

为什么它得到那些你的?我的目标是抛弃那些没有你的字符串并获得它们的总和。

回答

1

列表项都是unicode的类型,您可以将列表项转换为字符串,象下面这样:

numbers = [str(number.contents[0]) for number in tags] 

综上所述列表项,您需要将其转换为整数,而不是字符串:

numbers = [int(number.contents[0]) for number in tags] 
s = sum(numbers) 

输出:

>>> my_list = [u'97', u'97', u'90', u'90', ...] 
>>> 
>>> [str(item) for item in my_list] 
['97', '97', '90', '90', ...] 
>>> 
>>> s = sum(int(item) for item in my_list) 
>>> s 
2553 
+2

你不应该不经过编码类型编码为Unicode('STR()')。如果任何字段包含非ASCII,那么用户将得到一个巨大的UnicodeEncodeError异常 –

+0

@AlastairMcCormack我同意你的看法,就在这种情况下,我发现输入的数字不是非ascii字符。 – ettanany

0

你看到了,因为你正在打印清单。这将调用Python repr()方法,让您了解列表中的数据类型。

u''表示您的列表包含Unicode字符串。您现在无需担心此问题(有关更多详细信息,请参阅How to fix: "UnicodeDecodeError: 'ascii' codec can't decode byte")。

由于你需要总结你的值,你只需要将你的Unicode字符串值转换为整数。

您可以通过略微修改代码做到这一点:

numbers = [int(number.contents[0]) for number in tags]