如何在Beautiful Soup中打印出表行的所有单元格

时间:2018-05-15 03:01:24

标签: python python-2.7 beautifulsoup

我刚开始学习如何使用美丽的汤。

作为练习,我选择了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”标签的情况下打印所有内容,但如果不打印“无”,则可以识别第一个单元格中的所有内容?

3 个答案:

答案 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()