Python BeautifulSoup:使用相同的类名解析多个表

时间:2015-02-03 05:03:40

标签: python html python-2.7 beautifulsoup html-parsing

我正在尝试从维基页面解析一些表格,例如http://en.wikipedia.org/wiki/List_of_Bollywood_films_of_2014。 有四个表具有相同的班级名称" 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时,它会打印所有四个表。

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

1 个答案:

答案 0 :(得分:3)

findAll()返回一个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')

作为奖励,以下是如何将所有“发行版”收集到字典中,其中键是句点,值是电影列表:

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)

这可以让你更接近解决问题。