SHOW:
|
|
- or go back to the newest paste.
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 | - | get_table(html) # парсим таблицу |
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 | - | # ищем внутри него первый тег <div> |
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 | - | write_csv(save_dict) # записываем полученный словарь в csv |
55 | + | |
56 | save_dict['next_best'] = tds[8].text.strip() | |
57 | ||
58 | - | def write_csv(data): |
58 | + | yield save_dict # возвращаем данные построчно |
59 | - | with open('atpworldtour.csv', 'a') as file: |
59 | + | |
60 | # запись в csv, по-умолчанию разделитель полей запятая | |
61 | - | # последовательность ключей словаря, так, как они будут записаны в csv |
61 | + | def write_csv(data, cols, filename): |
62 | - | col = ['ranking', 'move', 'country', 'player', 'age', 'points', |
62 | + | with open(filename, 'w', newline='') as file: |
63 | - | 'tourn_played', 'points_dropping', 'next_best'] |
63 | + | writer = csv.DictWriter(file, fieldnames=cols) |
64 | for row in data: | |
65 | - | writer = csv.DictWriter(file, fieldnames = col) |
65 | + | writer.writerow(row) # записываем в файл |
66 | - | writer.writerow(data) # записываем в файл |
66 | + | |
67 | if __name__ == '__main__': | |
68 | main() |