Как я могу написать все ответы в функции zip или в Json? - PullRequest
0 голосов
/ 06 мая 2019

У меня есть ответ с сайта.Я хочу написать это в Json или Zip.Но я не знаю, как это сделать.Что я должен написать?

import requests
from bs4 import BeautifulSoup as bs
import json
from pprint import pprint


def get_html(url):
    r = requests.get(url)
    return r.text




def get_data(html):
    soup = bs(html, 'lxml')
    trs = soup.find('table', {'style':'padding-top:10px;'})

    for rows in trs.find_all('tr'):
        pairs = rows.find_all('a')
        for pair in pairs:
            for elem in pair:
                print(elem)




def main():
    groups = {
        'T-691': 'https://kbp.by/rasp/timetable/view_beta_tbp/?cat=group&id=26',
        'Т-717': 'https://kbp.by/rasp/timetable/view_beta_tbp/?cat=group&id=62'
    }
    group = input()
    url = 'https://kbp.by/rasp/timetable/view_beta_tbp/?cat=group&id={}'.format(groups[group])
    print(get_data(get_html(url)))


if __name__ == '__main__':
    main()

Мне бы хотелось, чтобы этот ответ был таким:

(«Элемент»: «Имя», «Номер группы»: «Имя») и т. Д.

1 Ответ

0 голосов
/ 07 мая 2019

Сначала вам нужно будет создать список словарей в нужном вам формате. Я предполагаю, что каждые 4 значения в каждой ячейке должны быть в отдельной записи, поэтому в следующем порядке сначала создается список всех записей. Это возвращается вызывающей стороне, а Python json.dump() используется для записи списка в output.json

import requests
from bs4 import BeautifulSoup as bs
import json
from operator import itemgetter
from pprint import pprint


fields = ['Item', 'Group number', 'Field 3', 'Field 4']
record = itemgetter(0, 1, 3, 4)    # Skip the blank 2nd entry


def get_html(url):
    r = requests.get(url)
    return r.text


def get_data(html):
    soup = bs(html, 'lxml')
    trs = soup.find('table', {'style':'padding-top:10px;'})

    rows = []

    for tr in trs.find_all('tr'):
        for td in tr.find_all('td'):
            a_tags = td.find_all('a')

            if a_tags:
                row = {field : value.get_text(strip=True) for field, value in zip(fields, record(a_tags))}
                rows.append(row)

    return rows


def main():
    groups = {
        'T-691': 'https://kbp.by/rasp/timetable/view_beta_tbp/?cat=group&id=26',
        'Т-717': 'https://kbp.by/rasp/timetable/view_beta_tbp/?cat=group&id=62'
    }

    group = input()
    url = 'https://kbp.by/rasp/timetable/view_beta_tbp/?cat=group&id={}'.format(groups[group])
    rows = get_data(get_html(url))

    with open('output.json', 'w', encoding='utf-8') as f_output:
        json.dump(rows, f_output)

if __name__ == '__main__':
    main()

Даю вам output.json Начинаем:

[
    {
        "Item": "ТестОтладкаПО",
        "Group number": "Якимович К",
        "Field 3": "Т-691",
        "Field 4": "408"
    },
    {
        "Item": "МатемМоделир",
        "Group number": "Клименко Д.Ф.",
        "Field 3": "Т-691",
        "Field 4": "429"
    }
]

Вам нужно будет присвоить правильные имена полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...