View difference between Paste ID: STKWKKy8 and X8cTA8ak
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()