【问题标题】:How to print out all cells of a table row in Beautiful Soup如何在 Beautiful Soup 中打印出表格行的所有单元格
【发布时间】:2018-10-24 18:51:38
【问题描述】:

我刚刚开始学习如何使用 Beautiful Soup。

作为练习,我选择了this page from ESPN

那里有一张桌子,上面有 NBA 球员和他们的幻想排名。 我能够打印出整行,它显示了我在浏览器中看到的所有内容。

但是,当我自己打印每个单元格时,它会打印出“无”,因为由于某种原因,它无法解析包含锚点的单元格

下面是我的代码:

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

我得到以下输出:

None
MIL
SF1

那么我怎样才能在没有“td”标签的情况下打印所有内容,但在不打印“None”的情况下识别第一个单元格中的所有内容?

【问题讨论】:

    标签: python python-2.7 beautifulsoup


    【解决方案1】:

    在最后一个循环中试试这个。将cell.string 更改为cell.text

    for cell in cells:
        print cell.text
    

    【讨论】:

    • 感谢您的提示。你是怎么知道这个方法(文本方法)的?我没有在文档中看到它。我可能是文盲,但我没有找到字符串“.text”
    • @Classified 在 Jupyter 中你可以做 obj. 然后点击 tab 它将显示一个对象的所有属性。您也可以输入dir(obj)。我通常在 Jupyter 中闲逛以熟悉库。
    【解决方案2】:

    来自official documentation 关于.string(强调我的):

    .string

    • 如果一个标签只有一个孩子,并且那个孩子是NavigableString,那么这个孩子就可以作为.string使用

    • 如果标签的唯一子标签是另一个标签,并且该标签具有.string,则认为父标签与其子标签具有相同的.string

    • 如果一个标签包含不止一个东西,那么.string应该指的是什么就不清楚了,所以.string被定义为None

    如果一个标签包含多个东西的意思是,如果一个标签包含另一个标签,tag.string 的计算结果为None。这就是您在代码中首先获得None 标记的原因(因为它包含另一个标记&lt;a&gt;)。

    因此,要获取标签的完整文本,您可以使用get_text()。所以,在你的代码中,使用cell.get_text()

    或者,对于这种情况,您也可以使用cell.text.textget_text() 相同,可以在source code 中看到:

    text = property(get_text) 
    

    【讨论】:

    • 你是怎么知道 .text 方法的?我没有在文档中看到它
    • 是的,文档中没有提到。我想我在学习它时看到它在一个 SO Q&A 中使用过。这就是我首先提到 get_text 的原因,因为它有据可查。
    【解决方案3】:

    你可以这样做 -

    print (cell.text)
    

    这将使您在单元格中跳过所有标签 init。

    【讨论】:

    • 你是怎么知道 .text 方法的?我没有在文档中看到它
    • @Classified 实际上我是按照 youtube 教程学习 bs 的。它在那里被提及:)
    猜你喜欢
    • 2021-03-20
    • 2018-01-20
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 2019-06-08
    • 2018-01-14
    • 2022-11-20
    相关资源
    最近更新 更多