我正在尝试从维基页面解析一些表格,例如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时,它会打印所有四个表。
另外,如何有效地解析内容,因为没有。连续的列是可变的?我想将这些信息存储到不同的变量中。
答案 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)
这可以让你更接近解决问题。