@Whey

Как можно построчно считать элементы таблицы?

Пишу парсер для сайта расписания, и возникла трудность связанная с тем, что элементы даты и предмета находятся в одном блоке div, но имеют разные классы. Мне нужно создать словарь, в котором ключ будет содержать дату, а значение - информация о предмете.
Сейчас все что у меня получилось сделать - это вывести расписание и дату раздельно через библиотеку bs4 функцией find_all().
Подскажите, каким образом можно объединить эти две функции для последующей записи в словарь?
Так выглядит HTML страница:
5cfb5b55267eb567154269.png
import requests
from bs4 import BeautifulSoup
import re

dir = {}

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


def get_data(html):
    soup = BeautifulSoup(html, 'lxml')
    schule = soup.find('div', class_='shedule_list margin_bottom_xx').find('table', class_='align_top schedule')
    rasp = schule.find_all('tr', class_='schedule-date')  # Дата
    rasptime = schule.find_all('tr', class_='schedule-time')  # Предмет

    for d in rasp:
        newdata = d.find('span', class_='date t_small_x t_gray_light').text
        print(newdata)

    for i in rasptime:
        sd = i.find_all('td')
        ChangePairs = re.search('дата изменения: (.*)', sd[5].text)
        print(ChangePairs[1])


def main():
    url = "http://www.asu.ru/timetable/students/32/2129436778/"
    print(get_data(get_html(url)))


if __name__ == '__main__':
    main()
  • Вопрос задан
  • 136 просмотров
Решения вопроса 1
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
import re
import pprint
import requests
import lxml.html

URL = 'http://www.asu.ru/timetable/students/32/2129436778/'

pp = pprint.PrettyPrinter(indent=4)
res = requests.get(URL)
root = lxml.html.fromstring(res.text)
table = list()
elems = root.xpath('.//tr[@class="schedule-date"]|.//tr[@class="schedule-time"]')

curr_date = ''

for el in elems:
    if el.get('class') == 'schedule-date':
        curr_date = el.xpath('.//span[1]')[0].text

    if el.get('class') == 'schedule-time':
        out = re.sub(' +', ' ', ''.join(el.itertext()))
        out = re.sub('^\s+', '', out)
        out = re.sub('\n+', '', out)
    table.append({'date': curr_date, 'info': out})
pp.pprint(table)


[   {   'date': 'Понедельник',
        'info': '4   13:20 - 14:50     лек. Физические методы исследования    '
                'проф. Смагин В.П.   500\xa0К       дата изменения: 08.04.2019 '
                '11:21  свободные аудитории    '},
    {   'date': 'Понедельник',
        'info': '2   09:40 - 11:10    а)  лаб. Новые информационные '
                'технологии    преп. Кушнир Е.Ю.   417\xa0К       дата '
                'изменения: 24.04.2019 11:16  свободные аудитории    '},
    {   'date': 'Понедельник',
        'info': '3   11:20 - 12:50     пр.з. Социология    доц. Артюхина '
                'В.А.   311а\xa0К       дата изменения: 24.04.2019 11:13  '
                'свободные аудитории    '},
    {   'date': 'Вторник',
        'info': '3   11:20 - 12:50     пр.з. Социология    доц. Артюхина '
                'В.А.   311а\xa0К       дата изменения: 24.04.2019 11:13  '
                'свободные аудитории    '},
    {   'date': 'Вторник',
        'info': '1   08:00 - 09:30     пр.з. Педагогика    доц. Зацепина '
                'О.В.   311а\xa0К       дата изменения: 24.04.2019 11:11  '
                'свободные аудитории    '},
    {   'date': 'Вторник',
        'info': '2   09:40 - 11:10     пр.з. Педагогика    доц. Зацепина '
                'О.В.   311а\xa0К       дата изменения: 24.04.2019 11:07  '
                'свободные аудитории    '},
    {   'date': 'Вторник',
        'info': '3   11:20 - 12:50     пр.з. Кристаллохимия    доц. Стручева '
                'Н.Е.   106а\xa0К       дата изменения: 24.04.2019 11:06  '
                'свободные аудитории    '},
    {   'date': 'Среда',
        'info': '3   11:20 - 12:50     пр.з. Кристаллохимия    доц. Стручева '
                'Н.Е.   106а\xa0К       дата изменения: 24.04.2019 11:06  '
                'свободные аудитории    '},
    {   'date': 'Среда',
        'info': '3   11:20 - 12:50    а)  лаб. Новые информационные '
                'технологии    преп. Кушнир Е.Ю.   419\xa0К       дата '
                'изменения: 08.04.2019 11:21  свободные аудитории    '},
    {   'date': 'Среда',
        'info': 'б)  лаб. Новые информационные технологии    доц. Геньш К.В.   '
                '417\xa0К       дата изменения: 08.04.2019 11:21  свободные '
                'аудитории    '},
    {   'date': 'Среда',
        'info': '4   13:20 - 14:50    б)  лаб. Новые информационные '
                'технологии    доц. Геньш К.В.   417\xa0К       дата '
                'изменения: 24.04.2019 11:18  свободные аудитории    '},
    {   'date': 'Четверг',
        'info': '4   13:20 - 14:50    б)  лаб. Новые информационные '
                'технологии    доц. Геньш К.В.   417\xa0К       дата '
                'изменения: 24.04.2019 11:18  свободные аудитории    '},
    {   'date': 'Четверг',
        'info': '2   09:40 - 11:10    а)  пр.з. Аналитическая химия    доц. '
                'Лейтес Е.А.   500\xa0К       дата изменения: 29.04.2019 '
                '10:56  свободные аудитории    '},
    {   'date': 'Четверг',
        'info': '3   11:20 - 12:50     пр.з. Физические методы исследования    '
                'проф. Смагин В.П.   521\xa0К       дата изменения: 24.04.2019 '
                '11:15  свободные аудитории    '},
    {   'date': 'Четверг',
        'info': '4   13:20 - 14:50    б)  пр.з. Аналитическая химия    проф. '
                'Смагин В.П.   508\xa0К       дата изменения: 29.04.2019 '
                '10:55  свободные аудитории    '},
    {   'date': 'Пятница',
        'info': '4   13:20 - 14:50    б)  пр.з. Аналитическая химия    проф. '
                'Смагин В.П.   508\xa0К       дата изменения: 29.04.2019 '
                '10:55  свободные аудитории    '},
    {   'date': 'Пятница',
        'info': '1   08:00 - 09:30    а)  лаб. Аналитическая химия    доц. '
                'Лейтес Е.А.   509\xa0К       дата изменения: 29.04.2019 '
                '10:55  свободные аудитории    '},
    {   'date': 'Пятница',
        'info': 'б)  лаб. Аналитическая химия    проф. Смагин В.П.   508\xa0'
                'К       дата изменения: 29.04.2019 10:55  свободные '
                'аудитории    '},
    {   'date': 'Пятница',
        'info': '2   09:40 - 11:10    а)  лаб. Аналитическая химия    доц. '
                'Лейтес Е.А.   509\xa0К       дата изменения: 29.04.2019 '
                '10:54  свободные аудитории    '},
    {   'date': 'Пятница',
        'info': 'б)  лаб. Аналитическая химия    проф. Смагин В.П.   508\xa0'
                'К       дата изменения: 29.04.2019 10:53  свободные '
                'аудитории    '},
    {   'date': 'Пятница',
        'info': '3   11:20 - 12:50    а)  лаб. Аналитическая химия    доц. '
                'Лейтес Е.А.   509\xa0К       дата изменения: 29.04.2019 '
                '10:53  свободные аудитории    '},
    {   'date': 'Пятница',
        'info': 'б)  лаб. Аналитическая химия    проф. Смагин В.П.   508\xa0'
                'К       дата изменения: 29.04.2019 10:52  свободные '
                'аудитории    '},
    {   'date': 'Пятница',
        'info': '4   13:20 - 14:50     лек. Физические методы исследования    '
                'проф. Смагин В.П.   500\xa0К       дата изменения: 08.04.2019 '
                '11:21  свободные аудитории    '}]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы