@RG2

Как добавить пробелы между абзацами?

Написал код, который должен выводить всю информацию с конкурсов РФФИ.

import requests
import json
from bs4 import BeautifulSoup
import chardet
import xlsxwriter
import re
from datetime import date, timedelta
 
PAGES_COUNT = 10
OUT_FILENAME = 'out.json'
 
 
def get_soup(url, **kwargs):
    response = requests.get(url, **kwargs)
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, features='html.parser')
    else:
        soup = None
    return soup
 
 
def crawl_products(pages_count):
    urls = []
    fmt = 'https://www.rfbr.ru/rffi/ru/contest?CONTEST_STATUS_ID=-1&CONTEST_TYPE=-1&CONTEST_YEAR=-1&page={page}'
 
    for page_n in range(1, 1 + pages_count):
        print('page: {}'.format(page_n))
 
        page_url = fmt.format(page=page_n)
        soup = get_soup(page_url)
        if soup is None:
            break
 
        for tag in soup.select('.tr .link'):
            href = tag.attrs['href']
            url = 'https://www.rfbr.ru/rffi/ru/contest{}'.format(href)
            urls.append(url)
    return urls
 
 
def parse_products(urls):
    data = []
 
    for url in urls:
        print('product: {}'.format(url))
 
        soup = get_soup(url)
        if soup is None:
            break
 
        for i in soup.find_all("h1"):
            name = i.text
        for j in soup.find_all("main", {"class":"template__main"}):
            for jj in j.find_all("div", {"class":"sfc l-3 mt-5 mb-10 lh-xl"}):
                ja = re.sub(r'[^\x00-\x7f]', r'', str(jj))
                jo = re.sub(r'\<[^>]*\>', '', str(ja))
                ji = re.sub(r'_', '', str(jo))
                ju = re.sub(r'  ', '', str(ji))
                je = re.sub(r' :', '', str(ju))
                jy = je[13:]
                amount = jy
        docs = [d.get_text(strip=True) for d in soup.find_all("div", attrs={"class":"list-in article"}) if d.get_text(strip=True)]
        article = [l.get_text(strip=True) for l in soup.find_all("p") if l.get_text(strip=True)]
        document = {
            'Формы заявок': docs[0].replace("Формы заявок", ""),
            'Договора и инструкции': docs[1].replace("Договор и инструкции", ""),
            'Формы отчетов': docs[2].replace("Формы отчетов", ""),
            'Формы вывода данных': "JSON",
        }
        for row in soup.select('td'):
            cols = row.select('td')
            cols = [c.text.strip() for c in cols]
        item = {
            'Название': name,
            'Статус': 'Заявки не принимаются',
            'Время окончания приема заявок': amount,
            'Полное описание условий конкурса': article[5].replace("конкурса(утверждены", "конкурса утверждены").replace("г.)", "г.").replace("года)", "года"),
        }
        item['Документы'] = document
        data.append(item)
 
    return data
 
 
def dump_to_json(filename, data, **kwargs):
    kwargs.setdefault('ensure_ascii', False)
    kwargs.setdefault('indent', 1)
 
    with open(OUT_FILENAME, 'w') as f:
        json.dump(data, f, **kwargs)
 
 
def main():
    urls = crawl_products(PAGES_COUNT)
    data = parse_products(urls)
    dump_to_json(OUT_FILENAME, data)
 
    with open(OUT_FILENAME, 'w') as f:
        json.dump(data, f, ensure_ascii=False, indent=1)
 
 
if __name__ == '__main__':
    main()


По итогу получилось следующее (вывожу фрагмент):

{
  "Название": "Конкурс на лучшие научные проекты фундаментальных исследований в сфере общественно-политических наук, реализуемые молодыми учеными, проводимый совместно РФФИ и ЭИСИ",
  "Статус": "Заявки не принимаются",
  "Время окончания приема заявок": "15.03.2021 23:59",
  "Полное описание условий конкурса": "Условия конкурса утверждены решением бюро совета РФФИ, протокол заседания бюро совета РФФИ № 2 (245) от 28.01.2021 г.",
  "Документы": {
   "Формы заявок": "Форма 4_опн_мол. Содержание проектаФорма 6_опн. Предварительный бюджет проектаФорма 1_опн. Данные о проектеФорма 1en. Данные о проекте на английском языкеФорма 2. Данные о физическом лицеФорма 3. Сведения об Организации",
   "Договора и инструкции": "Инструкция по оформлению и отправке отчёта в КИАС РФФИСправочная информация для заполнения приложения «Сведения о выплатах, произведенных организацией...»Инструкция по оформлению договора о предоставлении гранта победителю конкурса и реализации научного проектаИнструкция по оформлению заявки в КИАС РФФИДоговор о предоставлении гранта победителю конкурса и реализации научного проектаИнструкция по подтверждению согласия организации",
   "Формы отчетов": "Форма 503_опн_мол. Развернутый научный отчет по проектуФорма 501(итог). Краткий научный отчетФорма 506(итог). Финансовый отчетСведения о выплатах, произведенных организацией (DOCX)Краткая версия отчета о реализации научного проекта (DOCX)Форма 512. Данные о члене коллективаФорма 511. Возможности практического использования результатовФорма 509. Публикация по результатам проектаФорма 502(итог). Краткий научный отчет на английском языке",
   "Формы вывода данных": "JSON"
  }
 },


Если что, вот, к примеру, ссылка на один из конкурсов.
https://www.rfbr.ru/rffi/ru/contest/o_2116824

Хотелось бы узнать, как сделать так, чтобы в "Документах" названия форм не были слипшимися? А чтобы между ними был пробел. Или хотя бы выводились в кавычки-ёлочках.
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Не делать тупо .get_text(), а перебирать содержащиеся внутри теги (скорее всего будут <p> или <div>) по одному, извлекать текст уже из них, и вставлять после каждого тега символ - например, перевод строки.
Чтобы перебрать теги внутри тега, найди этот тег в soup, а потом уже на теге вызови .find_all().
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы