为什么Beautiful Soup无法显示表格中的所有<td>数据?

0 投票
1 回答
1083 浏览
提问于 2025-04-16 17:51

我一周前尝试从维基百科上抓取数据,但我搞不懂为什么用Beautiful Soup只能从某些表格列中提取到字符串,而其他表格列却显示“none”。

注意:这些表格列里都有数据。

我的程序是想提取所有带有“description”标签的表格列。我想从表格中提取所有的描述信息。

我抓取的网站是:http://en.wikipedia.org/wiki/Supernatural_(season_6

这是我的代码:

from BeautifulSoup import BeautifulSoup 
import urllib
import sys
from urllib import FancyURLopener

class MyOpener(FancyURLopener):
    version = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24'


def printList(rowList):
    for row in rowList:
        print row
        print '\n'

    return

url = "http://en.wikipedia.org/wiki/Supernatural_(season_6)"

#f = urllib.urlopen(url)
#content = f.read()
#f.close

myopener = MyOpener()
page = myopener.open(url)
content = page.read()
page.close()

soup = BeautifulSoup(''.join(content))
soup.prettify()

movieList = []

rowListTitle = soup.findAll('tr', 'vevent')
print len(rowListTitle)

#printList(rowListTitle)
for row in rowListTitle:
    col = row.next # explain this?
    if col != 'None':
        col = col.findNext("b")
        movieTitle = col.string
        movieTuple = (movieTitle,'')
        movieList.append(movieTuple)

#printList(movieList)

for row in movieList:
    print row[0]

rowListDescription = soup.findAll('td' , 'description')
print len(rowListDescription)


index = 1;
while ( index < len(rowListDescription) ):
    description = rowListDescription[index]
    print description
    print description.string
    str = description
    print '####################################'
    movieList[index - 1] = (movieList[index - 1][0],description)
    index = index + 1

我没有粘贴输出结果,因为实在太长了。不过输出结果很奇怪,虽然确实抓到了<td>里的信息,但当我用.string时,却得到了空内容。

1 个回答

0

所有的描述字符串都是空的吗?根据文档的说明:

为了方便,如果一个标签只有一个子节点,并且那个子节点是字符串,那么你可以通过标签的 tag.stringtag.contents[0] 来访问这个子节点。

在这种情况下,描述通常会有子节点,比如一个指向另一个维基百科文章的 <a> 链接。这种情况被认为是一个 非字符串 的子节点,所以描述节点的 string 会被设置为 None

撰写回答