Python BeautifulSoup: 解析具有相同 class 名称的多个表

Python BeautifulSoup: parsing multiple tables with same class name

我正在尝试从维基页面解析一些 tables,例如http://en.wikipedia.org/wiki/List_of_Bollywood_films_of_2014。 有四个 table 具有相同的 class 名称 "wikitable"。当我写:

movieList= soup.find('table',{'class':'wikitable'}) 
rows = movieList.findAll('tr')

它工作正常,但是当我写:

movieList= soup.findAll('table',{'class':'wikitable'})
rows = movieList.findAll('tr')

它抛出一个错误:

Traceback (most recent call last):
  File "C:\Python27\movieList.py", line 24, in <module>
    rows = movieList.findAll('tr')
AttributeError: 'ResultSet' object has no attribute 'findAll'

当我打印 movieList 时,它会打印所有四个 table。

此外,我该如何有效地解析内容,因为没有。一行中的列数是可变的?我想将这些信息存储到不同的变量中。

findAll() returns 一个 ResultSet 对象——基本上是一个元素列表。如果要在 ResultSet 中的每个元素内查找元素 - 使用循环:

movie_list = soup.findAll('table', {'class': 'wikitable'})
for movie in movie_list:
    rows = movie.findAll('tr')
    ...

您也可以使用 CSS Selector,但在这种情况下,区分电影之间的行并不容易:

rows = soup.select('table.wikitable tr')

作为奖励,您可以通过以下方式将所有 "Releases" 收集到字典中,其中键是句点,值是电影列表:

from pprint import pprint
import urllib2
from bs4 import BeautifulSoup

url = 'http://en.wikipedia.org/wiki/List_of_Bollywood_films_of_2014'
soup = BeautifulSoup(urllib2.urlopen(url))

headers = ['Opening', 'Title', 'Genre', 'Director', 'Cast']
results = {}
for block in soup.select('div#mw-content-text > h3'):
    title = block.find('span', class_='mw-headline').text
    rows = block.find_next_sibling('table', class_='wikitable').find_all('tr')

    results[title] = [{header: td.text for header, td in zip(headers, row.find_all('td'))}
                      for row in rows[1:]]

pprint(results)

这应该会让您更接近解决问题。