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)
这应该会让您更接近解决问题。
我正在尝试从维基页面解析一些 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)
这应该会让您更接近解决问题。