Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # pip install requests
- # pip install bs4
- # pip install lxml
- import csv
- import requests
- from bs4 import BeautifulSoup
- def main():
- url = 'http://www.atpworldtour.com/en/rankings/singles'
- cols = ['ranking', 'move', 'country', 'player', 'age', 'points',
- 'tourn_played', 'points_dropping', 'next_best']
- html = get_html(url) # получаем html
- write_csv(get_table(html), cols, 'atpworldtour.csv') # пишем таблицу в файл
- def get_html(url):
- resp = requests.get(url) # скачиваем html код страницы
- return resp.text # возвращаем html
- def get_table(html):
- save_dict = {} # словарь для записи в csv
- soup = BeautifulSoup(html, 'lxml') # создаем объект BeautifulSoup, используем парсер lxml
- table = soup.find('table', class_='mega-table') # ищем тег <table> c классом class="mega-table"
- trs = table.find_all('tr') # find_all - искать все теги <tr> (будет список), если не найдет будет None
- for tr in trs: # перебираем теги tr
- tds = tr.find_all('td') # в каждом теге tr ищем все теги <td> (будет список)
- if tds: # если не None, есть список, собираем данные из <td>
- save_dict['ranking'] = tds[0].text.strip() # берем первый td из списка, берем из него текст
- # очищаем от лишних пробелов
- trend_move = tds[1].find('div')['class'] # берем второй td
- # ищем внутри него первый тег <div>.
- # и получаем значение его аттрибута class
- # там три варианта class "move-up" "move-down" "move-none"
- if 'up' in trend_move[0]:
- save_dict['move'] = 'up ' + tds[1].find('div', class_='move-text').text.strip()
- elif 'down' in trend_move[0]:
- save_dict['move'] = 'down ' + tds[1].find('div', class_='move-text').text.strip()
- else:
- save_dict['move'] = tds[1].find('div', class_='move-text').text.strip()
- # берем 3ий <td>, ищем внутри него тег <div>, с классом "country-item"
- # затем внутри div берем первый тег <img> и получаем его аттрибут alt, в котором
- # храниться сокращенное название страны
- save_dict['country'] = tds[2].find('div', class_='country-item').img.attrs['alt']
- # берем 4ый <td>, ищем внутри него первый тег <a>, забираем текст тега <a>,
- # очищаем от лишних пробелов strip()
- save_dict['player'] = tds[3].a.text.strip()
- save_dict['age'] = tds[4].text.strip()
- save_dict['points'] = tds[5].a.text.strip()#.replace(',', '') #для нормализации чисел лучше replace
- save_dict['tourn_played'] = tds[6].a.text.strip()
- save_dict['points_dropping'] = tds[7].text.strip()#.replace(',', '') #для нормализации чисел лучше replace
- save_dict['next_best'] = tds[8].text.strip()
- yield save_dict # возвращаем данные построчно
- # запись в csv, по-умолчанию разделитель полей запятая
- def write_csv(data, cols, filename):
- with open(filename, 'w', newline='') as file:
- writer = csv.DictWriter(file, fieldnames=cols)
- for row in data:
- writer.writerow(row) # записываем в файл
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement