2017-01-15 2 views
-2

смотрели на программе футбола выскабливания питона и нашел это на StackOverflow, который удовлетворяет мои потребности, Python Beautifulsoup4 website parsingпитона и BeautifulSoup выскабливания футбола

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

from bs4 import BeautifulSoup 
import urllib2 
import csv 

url = 'http://www.bbc.co.uk/sport/football/fa-cup/results' 
page = urllib2.urlopen(url).read() 
soup = BeautifulSoup(page) 

league = 'FA' 

for games in soup.find_all('table', class_='table-stats'): 
    played_tag = games.find('caption') 
    played = played_tag and ''.join(played_tag.stripped_strings) 
    print played 

    for match in soup.find_all('td', class_='match-details'): 
     home_tag = match.find('span', class_='team-home') 
     home = home_tag and ''.join(home_tag.stripped_strings) 
     score_tag = match.find('span', class_='score') 
     score = score_tag and ''.join(score_tag.stripped_strings) 
     away_tag = match.find('span', class_='team-away') 
     away = away_tag and ''.join(away_tag.stripped_strings) 

     if (score.split('-')[0] > score.rsplit('-')[1]): 
      home_win = 1 
     else: 
      home_win = 0 

     if (score.rsplit('-')[1] > score.split('-')[0]): 
      away_win = 1 
     else: 
      away_win = 0 


     if home and score and away: 
      print league,',',home,',',home_win,',',score 
      print league,',',away,',',away_win,',',score 
+1

Покажите нам, сколько вы сделали до сих пор. Мы не пишем для вас код на этом сайте. – DyZ

+0

Сделайте код частью вашего вопроса. – DyZ

+0

Пожалуйста, сделайте свой код правильно отформатированной частью вашего первоначально поставленного вопроса. – DyZ

ответ

0

Вам нужно получить дату из заголовка тега и добавить некоторую логику, чтобы проверить против, например, список желаемых дат.

Получить дату из заголовка метки строки с регулярным выражением и преобразовать его в Задан объект:

date_pattern = re.compile(r'(\d{1,2})\w{2}\s([\w]+\s\d{4})') # pattern 

played_date = re.findall(date_pattern, played_tag.get_text()) # find pattern in caption tag string played_tag 
played_date = ' '.join(played_date[0]) 
played_date = datetime.strptime(played_date, '%d %B %Y') # convert it into datetime object 

и определить список дат вы хотите, чтобы скоблить:

list_of_dates = ['2017-01-07', '2017-01-06'] # put all dates to be print here 

def dates_to_datetime(dates): 
    """ Converts a list of date strings to a list of datetime objects """ 
    datetime_objs = [] 
    for d in dates: 
     datetime_objs.append(datetime.strptime(d, '%Y-%m-%d')) 
    return datetime_objs 

list_of_dates = dates_to_datetime(list_of_dates) # converts list_of_dates to list of datetime objects 

Наконец, вам нужно для добавления инструкции if, чтобы проверить, указана ли дата, полученная из строки тега заголовка, в вашем списке дат:

# check if retrieved date is in list_of_dates 
if played_date in list_of_dates: 

Это полный пример:

import re 
from datetime import datetime 
from bs4 import BeautifulSoup 
import urllib2 
import csv 


list_of_dates = ['2017-01-07', '2017-01-06'] # put all dates to be print here 


def dates_to_datetime(dates): 
    """ Converts a list of date strings to a list of datetime objects """ 
    datetime_objs = [] 
    for d in dates: 
     datetime_objs.append(datetime.strptime(d, '%Y-%m-%d')) 
    return datetime_objs 


list_of_dates = dates_to_datetime(list_of_dates) # converts list_of_dates to list of datetime objects 

date_pattern = re.compile(r'(\d{1,2})\w{2}\s([\w]+\s\d{4})') # date pattern in <caption> tag i.e.: 9th January 2017 

url = 'http://www.bbc.co.uk/sport/football/fa-cup/results' 
page = urllib2.urlopen(url).read() 
soup = BeautifulSoup(page) 

league = 'FA' 

for games in soup.find_all('table', class_='table-stats'): 
    played_tag = games.find('caption') 

    # retrieve date from caption tag 
    played_date = re.findall(date_pattern, played_tag.get_text()) 
    played_date = ' '.join(played_date[0]) 
    played_date = datetime.strptime(played_date, '%d %B %Y') 

    # check if retrieved date is in list_of_dates 
    if played_date in list_of_dates: 

     played = played_tag and ''.join(played_tag.stripped_strings) 
     print played 

     for match in soup.find_all('td', class_='match-details'): 
      home_tag = match.find('span', class_='team-home') 
      home = home_tag and ''.join(home_tag.stripped_strings) 
      score_tag = match.find('span', class_='score') 
      score = score_tag and ''.join(score_tag.stripped_strings) 
      away_tag = match.find('span', class_='team-away') 
      away = away_tag and ''.join(away_tag.stripped_strings) 

      if (score.split('-')[0] > score.rsplit('-')[1]): 
       home_win = 1 
      else: 
       home_win = 0 

      if (score.rsplit('-')[1] > score.split('-')[0]): 
       away_win = 1 
      else: 
       away_win = 0 


      if home and score and away: 
       print league,',',home,',',home_win,',',score 
       print league,',',away,',',away_win,',',score 
    else: 
     pass 
+0

Thx для ввода @Benjamin он дал мне что-то, над чем работать, к сожалению, он действительно возвращает ожидаемый результат, он перечисляет все игры, например, последние 3 строки вывода, игра была фактически сыграна в пятницу, 4 ноября, а не 6 января. Я думаю, что для соответствия в soup.find возвращается все значения. 2017-01-06 00:00:00, FA, Southend United, 0, 2017-01-06 00:00:00, FA, Eastleigh, 0, 2017-01-06 00:00:00, FA, Swindon Town, 0, >>> – mal

+0

Мне нужно найти способ перебрать все теги для каждого экземпляра тега

, а не всех экземпляров тега
. Используя сравнение даты, выберите те экземпляры тегов для выбора. – mal

0

Благодаря @Benjamin для сдачи меня на верном пути, небольшое изменение в его ответе, с тем, чтобы проверить дату во втором цикле, я знаю, что это неэффективно, что он будет перебирать все данные для каждой выбранной даты, но он выполняет мою конечную цель.

import re 
from datetime import datetime 
from bs4 import BeautifulSoup 
import urllib2 
import csv 


list_of_dates = ['2016-11-06', '2016-11-05'] # put all dates to be print here 


def dates_to_datetime(dates): 
    """ Converts a list of date strings to a list of datetime objects """ 
    datetime_objs = [] 
    for d in dates: 
     datetime_objs.append(datetime.strptime(d, '%Y-%m-%d')) 
    return datetime_objs 


list_of_dates = dates_to_datetime(list_of_dates) # converts list_of_dates to list of datetime objects 

date_pattern = re.compile(r'(\d{1,2})\w{2}\s([\w]+\s\d{4})') # date pattern in <caption> tag i.e.: 9th January 2017 

url = 'http://www.bbc.co.uk/sport/football/fa-cup/results' 
page = urllib2.urlopen(url).read() 
soup = BeautifulSoup(page) 

league = 'FA' 

for games in soup.find_all('table', class_='table-stats'): 
    played_tag = games.find('caption') 

    # retrieve date from caption tag 
    played_date = re.findall(date_pattern, played_tag.get_text()) 
    played_date = ' '.join(played_date[0]) 
    played_date = datetime.strptime(played_date, '%d %B %Y') 

    # check if retrieved date is in list_of_dates 
    if played_date in list_of_dates: 

     for match in soup.find_all('td', class_='match-details'): 

     # get parent match date    
      match_date = match.parent.parent.parent.caption 
      if match_date == played_tag: 
       home_tag = match.find('span', class_='team-home') 
       home = home_tag and ''.join(home_tag.stripped_strings) 
       score_tag = match.find('span', class_='score') 
       score = score_tag and ''.join(score_tag.stripped_strings) 
       away_tag = match.find('span', class_='team-away') 
       away = away_tag and ''.join(away_tag.stripped_strings) 

       if (score.split('-')[0] > score.rsplit('-')[1]): 
        home_win = 1 
       else: 
        home_win = 0 

       if (score.rsplit('-')[1] > score.split('-')[0]): 
        away_win = 1 
       else: 
        away_win = 0 


       if home and score and away: 
        print played_date, ',', league,',',home,',',home_win 
        print played_date, ',', league,',',away,',',away_win 
     else: 
      pass 
0

Это лучше, поскольку оно не проходит через все игры, только те, которые вам нужны.

import re 
from datetime import datetime 
from bs4 import BeautifulSoup 
import urllib2 
import csv 

f = open('/FACup.csv', 'wt') 
writer = csv.writer(f) 

list_of_dates = ['2017-01-09', '2017-01-08', '2017-01-07', '2017-01-06'] # put all dates to be print here 


def dates_to_datetime(dates): 
    """ Converts a list of date strings to a list of datetime objects """ 
    datetime_objs = [] 
    for d in dates: 
     datetime_objs.append(datetime.strptime(d, '%Y-%m-%d')) 
    return datetime_objs 


list_of_dates = dates_to_datetime(list_of_dates) # converts list_of_dates to list of datetime objects 

date_pattern = re.compile(r'(\d{1,2})\w{2}\s([\w]+\s\d{4})') # date pattern in <caption> tag i.e.: 9th January 2017 

url = 'http://www.bbc.co.uk/sport/football/fa-cup/results' 
page = urllib2.urlopen(url).read() 
soup = BeautifulSoup(page) 

league = 'FA' 

for games in soup.find_all('table', class_='table-stats'): 
    played_tag = games.find('caption') 

    # retrieve date from caption tag 
    played_date = re.findall(date_pattern, played_tag.get_text()) 
    played_date = ' '.join(played_date[0]) 
    played_date = datetime.strptime(played_date, '%d %B %Y') 

    # check if retrieved date is in list_of_dates 
    if played_date in list_of_dates: 

     for match in games.find_all('td', class_='match-details'): 
      home_tag = match.find('span', class_='team-home') 
      home = home_tag and ''.join(home_tag.stripped_strings) 
      score_tag = match.find('span', class_='score') 
      score = score_tag and ''.join(score_tag.stripped_strings) 
      away_tag = match.find('span', class_='team-away') 
      away = away_tag and ''.join(away_tag.stripped_strings) 

      if (score.split('-')[0] > score.rsplit('-')[1]): 
       home_win = 1 
      else: 
       home_win = 0 

      if (score.rsplit('-')[1] > score.split('-')[0]): 
       away_win = 1 
      else: 
       away_win = 0 


      if home and score and away: 
       writer.writerow((league, played_date.strftime('%Y-%m-%d'), home, home_win, 'H')) 
       writer.writerow((league, played_date.strftime('%Y-%m-%d'), away, away_win, 'A')) 
    else: 
     pass 

f.close() 

 Смежные вопросы

  • Нет связанных вопросов^_^