@RG2

Как извлечь выделенное определенным цветом слово?

Есть у меня код, занимающийся парсингом информации о конкурсах с сайта РНФ. Да-да, снова парсинги. Но не волнуйтесь, я уже знаю, что да как. И написал код. Он у меня работает как часы. Ошибок никаких не выдает.

import requests
from bs4 import BeautifulSoup
import re
import os
from urllib.request import urlopen
import json
from urllib.parse import unquote

import warnings
warnings.filterwarnings("ignore")

BASE_URL = 'https://www.rscf.ru/contests'

session = requests.Session()
session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0'

items = []
max_page = 10
for page in range(1, max_page + 1):
    url = f'{BASE_URL}/?PAGEN_2={page}/' if page > 1 else BASE_URL
    print(url)

    rs = session.get(url, verify=False)
    rs.raise_for_status()

    soup = BeautifulSoup(rs.content, 'html.parser')
    for item in soup.select('.classification-table-row.contest-table-row'):
        number = item.select_one('.contest-num').text
        title = item.select_one('.contest-name').text
        date = item.select_one('.contest-date').text.replace("\n", "")
        synopsis = item.select_one('.contest-status').text.replace("\n", " ")
        documents = item.select_one('.contest-docs').text.replace("\n", " ").replace("        ", " ").replace("    ", " ")
        items.append({
            'Номер': number,
            'Наименование конкурса': title,
            'Приём заявок': date,
            'Статус': synopsis,
            'Документы': documents,
        })

with open('out.json', 'w', encoding='utf-8') as f:
    json.dump(items, f, indent=4, ensure_ascii=False)


Всё работает, все в порядке. Есть один нюанс.
Дело в том, что на сайте есть такая фишка - цвет текста. В зависимости от того, действует ли конкурс или он завершён, статус окрашивается в определённый цвет. Если идёт приём заявок, то статус выделяется зелёным цветом. Если проводится экспертиза - оранжевый. А если конкурс завершён - красный. Вот тут конкурсы.
Ссылка удалена модератором.
И мне нужно, чтобы код выводил цветной текст. К сожалению, в Интернете найти похожее мне не удалось. Там только коды, которые окрашивают текст в цвет. Но не извлекают готовый.
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
@RG2 Автор вопроса
Пораскинув мозгами, я решил иначе и написал вот такой код:
import requests
from bs4 import BeautifulSoup
import re
import os
from urllib.request import urlopen
import json
from urllib.parse import unquote
 
import warnings
warnings.filterwarnings("ignore")
 
BASE_URL = 'https://www.rscf.ru/contests'
 
session = requests.Session()
session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0'
 
items = []
max_page = 10
for page in range(1, max_page + 1):
    url = f'{BASE_URL}/?PAGEN_2={page}/' if page > 1 else BASE_URL
    print(url)
 
    rs = session.get(url, verify=False)
    rs.raise_for_status()
 
    soup = BeautifulSoup(rs.content, 'html.parser')
    for item in soup.select('.classification-table-row.contest-table-row'):
        number = item.select_one('.contest-num').text
        title = item.select_one('.contest-name').text
        date = item.select_one('.contest-date').text.replace("\n", "").replace("Подать заявку", "")
        documents = item.select_one('.contest-docs').text.replace("\n", " ").replace("        ", " ").replace("    ", " ")
        try:
            synopsis = [s.get_text(strip=True) for s in item.select(".contest-status") if s.get_text(strip=True)]
            del synopsis[:1]
            syn = str(synopsis).replace("['", '').replace("']", '')
        except:
            synopsis = [s.get_text(strip=True) for s in item.select(".contest-success") if s.get_text(strip=True)]
            del synopsis[:1]
            syn = str(synopsis).replace("['", '').replace("']", '')
        items.append({
            'Номер': number,
            'Наименование конкурса': title,
            'Приём заявок': date,
            'Статус': syn,
            'Документы': documents,
        })
 
with open('out.json', 'w', encoding='utf-8') as f:
    json.dump(items, f, indent=4, ensure_ascii=False)


Результат:
{
        "Номер": "92",
        "Наименование конкурса": " Конкурс на получение грантов РНФ по мероприятию «Проведение фундаментальных научных исследований и поисковых научных исследований отдельными научными группами»",
        "Приём заявок": "до 15.11.2023 17:00",
        "Статус": "Прием заявок",
        "Документы": " Извещение Конкурсная документация    "
    },
    {
        "Номер": "3005",
        "Наименование конкурса": "Конкурс на получение грантов РНФ «Проведение пилотных проектов НИОКР в рамках стратегических инициатив Президента РФ в научно-технологической сфере» по теме: «Разработка нитрид-галлиевого СВЧ-транзистора S-диапазона с выходной мощностью не менее 120 Вт»",
        "Приём заявок": "до 02.06.2023 17:00",
        "Статус": "Конкурс завершен",
        "Документы": " Извещение Конкурсная документация Список победителей "
    },
    {

Можете проверить, если что.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@chemdev
в json нет опции цветной текст, поэтому ты ничего и не можешь найти (смотри спецификацию json), но ты можешь хранить строку с названием цвета в отдельном поле, чтобы использовать потом. Однако и это будет лишней информацией потому что понятно что цвет - функция от строки.
Ответ написан
Ваш ответ на вопрос

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

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