我刚开始学习如何使用美丽的汤。
作为练习,我选择了this page from ESPN。
那里有一张NBA球员和他们的幻想队伍。 我能够打印整行,它显示了我在浏览器中看到的所有内容。
然而,当我单独打印每个单元格时,它打印出“无”,因为由于某种原因,它无法解析包含锚点的单元格
以下是我的代码:
int
如果我使用
from bs4 import BeautifulSoup
import urllib2
import re
if __name__ == '__main__':
url = "http://www.espn.com/espn/print?id=20443164"
resp = urllib2.urlopen(url)
soup = BeautifulSoup(resp.read())
table = soup.find_all("table")
mytable = table[2]
rows = mytable.findChildren(['th','tr'])
print rows
for row in rows:
cells = row.findChildren('td')
for cell in cells:
# print cell.string # line in question
print cell # line in question
我得到以下输出:
print cell
如果我使用
<td>1. <a href="http://www.espn.com/nba/player/_/id/3032977/giannis-antetokounmpo">Giannis Antetokounmpo</a>, SF/PF</td>
<td>PHI</td>
<td>C24</td>
我得到以下输出:
print cell.string
那么如何在不使用“td”标签的情况下打印所有内容,但如果不打印“无”,则可以识别第一个单元格中的所有内容?
答案 0 :(得分:2)
在最后一个循环中尝试这个。将cell.string
更改为cell.text
for cell in cells:
print cell.text
答案 1 :(得分:1)
你可以这样做 -
print (cell.text)
这将使您在单元格中跳过所有标签init。
答案 2 :(得分:1)
关于official documentation {强调我的.string
:
<强>
.string
强>
如果某个标签只有一个孩子,且该孩子为
NavigableString
,则该子项将显示为.string
如果标记的唯一子标记是另一个标记,并且该标记具有
.string
,那么父标记被视为与其子标记<{1}}如果某个代码包含多个内容,则不清楚
.string
应引用的内容,因此.string
定义为.string
的含义如果标记包含多个内容,则标记包含其他标记时,None
的结果为tag.string
。这就是您在代码中首先获得None
代码None
的原因(因为它包含另一个代码<td>
)。
因此,要获取标记的完整文本,您可以使用get_text()
。因此,在您的代码中,使用<a>
。
或者,对于这种情况,您也可以使用cell.get_text()
。 cell.text
与.text
相同,您可以在source code中看到:
get_text()