2014-08-07 3 views
1

Я использую эту страницу: http://www.afl.com.au/match-centre/2014/20/rich-v-esshttp://www.afl.com.au/match-centre/2014/19/fre-v-carlFetch статистику с помощью Beautiful Soup

принести статистику, которая дается на правой стороне. Я приложил снимок экрана ниже.

enter image description here

Я использовал следующие функции для извлечения данных. Я создал суп и передал его как параметр функции ниже:

def fetchStats(soup): 

    for i in soup.findAll("div", {"class" : "module", "id" : "season-stats"}): 
     for index in i.findAll("div", {"class" : "module-content"}): 
      for item in index.findAll("ul", style=False): 

       li = item.findAll("li", {"class" : "major"}) 
       print item.getText() 
      break 
     break 

Но он не работает, как я хочу. Мне нужно все параметры для команды, которые будут храниться в словаре, где в ключе словаря будет название команды и ее значение будет иметь кортеж, имеющий два элемента - имя параметра и его значение, как,

dic = {"Team 1 Name": [("Disposlas",311), ("Kicks", 190) .....], "Team 2 Name" : [("Disposlas",315), ("Kicks", 224) .....]} 

Пожалуйста, помогите мне.

+0

Возможно, вам стоит опубликовать HTML-код. – taco

+0

Рассматривая ссылку, это 3 неупорядоченных списка (элемент UL). Я бы собрал все три в массивы, а затем объединил их в один. – taco

ответ

0

Идея заключается в том, чтобы получить все статистику хозяев поля, прочь статистику команды и статистика имен и поместить их в отдельные списки, а затем zip() их:

from pprint import pprint 
from urllib2 import urlopen 
from bs4 import BeautifulSoup 


url = "http://www.afl.com.au/match-centre/2014/20/rich-v-esshttp://www.afl.com.au/match-centre/2014/19/fre-v-carl" 
soup = BeautifulSoup(urlopen(url)) 

# get team names 
home_team_name = soup.find('div', class_='home-team').p.a.text.strip() 
away_team_name = soup.find('div', class_='away-team').p.a.text.strip() 

# get stats 
season_stats = soup.find('div', id='season-stats') 
home_stats = [li.text for li in season_stats.select('ul#home-team-stats > li')] 
away_stats = [li.text for li in season_stats.select('ul#away-team-stats > li')] 
params = [li.text for li in season_stats.select('ul.headers > li')] 

stats = {home_team_name: zip(params, home_stats), 
     away_team_name: zip(params, away_stats)} 

pprint(stats) 

Печать:

{u'Carlton': [(u'Disposals', u'315'), 
       (u'Kicks', u'224'), 
       (u'Handballs', u'91'), 
       (u'Free Kicks', u'22'), 
       (u'Clearances', u'39'), 
       (u'Centre', u'13'), 
       (u'Stoppages', u'26'), 
       (u'Inside 50', u'40'), 
       (u'Marks in 50', u'8'), 
       (u'Contested Possessions', u'127'), 
       (u'Tackles', u'59'), 
       (u'Hit-Outs', u'23'), 
       (u'Interchanges', u'111')], 
u'Fremantle': [(u'Disposals', u'311'), 
       (u'Kicks', u'190'), 
       (u'Handballs', u'121'), 
       (u'Free Kicks', u'14'), 
       (u'Clearances', u'38'), 
       (u'Centre', u'10'), 
       (u'Stoppages', u'28'), 
       (u'Inside 50', u'47'), 
       (u'Marks in 50', u'13'), 
       (u'Contested Possessions', u'124'), 
       (u'Tackles', u'63'), 
       (u'Hit-Outs', u'75'), 
       (u'Interchanges', u'96')]} 

FYI , вы можете узнать больше об этих select() звонках здесь: CSS Selectors.

+0

Большое спасибо, это так полезно. А также я узнал, как использовать bs4. Еще раз спасибо – Anand

+0

@ И мне понравилось писать, спасибо за интересную задачу :) – alecxe

+0

My Pleasure Sir ... – Anand