Advertisement
extrn

Untitled

Apr 20th, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # pip install requests
  2. # pip install bs4
  3. # pip install lxml
  4.  
  5. import csv
  6. import requests
  7. from bs4 import BeautifulSoup
  8.  
  9. def main():
  10.     url = 'http://www.atpworldtour.com/en/rankings/singles'
  11.     cols = ['ranking', 'move', 'country', 'player', 'age', 'points',
  12.             'tourn_played', 'points_dropping', 'next_best']
  13.  
  14.     html = get_html(url) # получаем html
  15.     write_csv(get_table(html), cols, 'atpworldtour.csv') # пишем таблицу в файл
  16.  
  17. def get_html(url):
  18.     resp = requests.get(url) # скачиваем html код страницы
  19.     return resp.text # возвращаем html
  20.  
  21.  
  22. def get_table(html):
  23.     save_dict = {} # словарь для записи в csv
  24.     soup = BeautifulSoup(html, 'lxml') # создаем объект BeautifulSoup, используем парсер lxml
  25.     table = soup.find('table', class_='mega-table') # ищем тег <table> c классом class="mega-table"
  26.     trs = table.find_all('tr') # find_all - искать все теги <tr> (будет список), если не найдет будет None
  27.     for tr in trs: # перебираем теги tr
  28.         tds = tr.find_all('td') # в каждом теге tr ищем все теги <td> (будет список)
  29.         if tds: # если не None, есть список, собираем данные из <td>
  30.             save_dict['ranking'] = tds[0].text.strip() # берем первый td из списка, берем из него текст
  31.                                                         # очищаем от лишних пробелов
  32.  
  33.             trend_move = tds[1].find('div')['class'] # берем второй td
  34.                                                     # ищем внутри него первый тег <div>.
  35.                                                     # и получаем значение его аттрибута class
  36.             # там три варианта class "move-up" "move-down" "move-none"
  37.             if 'up' in trend_move[0]:
  38.                 save_dict['move'] = 'up ' + tds[1].find('div', class_='move-text').text.strip()
  39.             elif 'down' in trend_move[0]:
  40.                 save_dict['move'] = 'down ' + tds[1].find('div', class_='move-text').text.strip()
  41.             else:
  42.                 save_dict['move'] = tds[1].find('div', class_='move-text').text.strip()
  43.  
  44.             # берем 3ий <td>, ищем внутри него тег <div>, с классом "country-item"
  45.             # затем внутри div берем первый тег <img> и получаем его аттрибут alt, в котором
  46.             # храниться сокращенное название страны
  47.             save_dict['country'] = tds[2].find('div', class_='country-item').img.attrs['alt']
  48.  
  49.             # берем 4ый <td>, ищем внутри него первый тег <a>, забираем текст тега <a>,
  50.             # очищаем от лишних пробелов strip()
  51.             save_dict['player'] = tds[3].a.text.strip()
  52.             save_dict['age'] = tds[4].text.strip()
  53.             save_dict['points'] = tds[5].a.text.strip()#.replace(',', '') #для нормализации чисел лучше replace
  54.             save_dict['tourn_played'] = tds[6].a.text.strip()
  55.             save_dict['points_dropping'] = tds[7].text.strip()#.replace(',', '') #для нормализации чисел лучше replace
  56.             save_dict['next_best'] = tds[8].text.strip()
  57.  
  58.             yield save_dict # возвращаем данные построчно
  59.  
  60. # запись в csv, по-умолчанию разделитель полей запятая
  61. def write_csv(data, cols, filename):
  62.     with open(filename, 'w', newline='') as file:
  63.         writer = csv.DictWriter(file, fieldnames=cols)
  64.         for row in data:
  65.             writer.writerow(row) # записываем в файл
  66.  
  67. if __name__ == '__main__':
  68.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement