Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 50

Как выделить в HTML определённое предложение и вывести в JSON

18.06.2023, 14:56. Показов 611. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть ли такой на Python'е код, который выделяет определённое предложение? Ну, имеется в виду предложение, которое начинается с определённого слова, и которое нужно выделить и извлечь? Вот, к примеру, мне нужно извлечь из каждой ссылки на конкурсы РФФИ (https://www.rfbr.ru/rffi/ru/contest?page=78) предложения, которые начинаются со слов "Условия конкурса:". Вот один из примеров (https://www.rfbr.ru/rffi/ru/contest/o_30235):

"Условия конкурса Все виды поддержки фундаментальных научных исследований осуществляются Фондом на конкурсной основе независимо от возраста, ученого звания, ученой степени или должности, занимаемой ученым.

Конкурс НЦНИ_а проводится по правилам конкурса инициативных научных проектов (конкурс "а").
Собственно, сам код.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import requests
import json
from bs4 import BeautifulSoup
import chardet
import xlsxwriter
import re
from datetime import date, timedelta
 
PAGES_COUNT = 30
OUT_FILENAME = 'out.json'
 
import warnings
warnings.filterwarnings("ignore")
 
 
def get_soup(url, **kwargs):
    response = requests.get(url, **kwargs, verify=False)
    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
        rponse = requests.get(url, verify=False)
        sp = BeautifulSoup(rponse.text, "lxml")
        document ={}
        dcs = sp(attrs={"class": "list-in article"})
        for z in dcs:
            document[z.h2.text] = list(z.ol.stripped_strings)
            # document[z.h2.text] = tuple(z.ol.stripped_strings)
 
        # в одну строку с разделителем запятая
        for z in dcs:
            document[z.h2.text] = ', '.join(z.ol.stripped_strings)
        article = [l.get_text(strip=True) for l in soup.find_all("div", {"class":"article"}) if l.get_text(strip=True)]
        art = str(article).replace("['", '').replace("']", '').replace("\\xa0", ' ')
        for row in soup.select('td'):
            cols = row.select('td')
            cols = [c.text.strip() for c in cols]
        item = {
            'Название': name,
            'Статус': 'Заявки не принимаются',
            'Время окончания приема заявок': amount,
            'Полное описание условий конкурса': art
        }
        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', encoding='utf-8') 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', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=1)
 
 
if __name__ == '__main__':
    main()
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.06.2023, 14:56
Ответы с готовыми решениями:

Как из файла выделить строчку в которой есть определенное слово, и вывести его отдельно
Условие такое: В экзаменационной ведомости каждая строка имеет вид: Иванов – хорошо, Сидоров – удовлетворительно и т.д., распечатать...

Как вывести определённое значение из Mysql в html коде?
Подскажите пожалуйста как вывести конкретное значение если есть несколько таблиц в одной данные после регистрации, а надо вывести значение...

Как вывести некоторые данные из файла json на страницу html?
Как с помощью JavaScript вывести некоторые данные из файла json на страницу html ? Нужно вывести данные &quot;city&quot;,...

4
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
18.06.2023, 21:59
Цитата Сообщение от lochin2 Посмотреть сообщение
предложения, которые начинаются со
startswith() например

Добавлено через 31 секунду
Ну или регулярки, ага
1
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 50
18.06.2023, 23:23  [ТС]
Startswith() пробовал. Вставлял в l.get_text(strip=True).
Вроде бы выводил. Но, увы, не из всех страниц.
А если startswith() в других местах, кроме l.get_text, то вообще пустота выводится.

Добавлено через 36 секунд
Куда вообще стоит startswith() вставлять? Или есть альтернатива ему?
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
18.06.2023, 23:25
Цитата Сообщение от lochin2
есть альтернатива
Цитата Сообщение от iSmokeJC
регулярки, ага
0
1 / 1 / 0
Регистрация: 20.10.2020
Сообщений: 50
19.06.2023, 14:15  [ТС]
Собственно, вот сам код
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import requests
import json
from bs4 import BeautifulSoup
import chardet
import xlsxwriter
import re
from datetime import date, timedelta
 
PAGES_COUNT = 100
OUT_FILENAME = 'out.json'
 
import warnings
warnings.filterwarnings("ignore")
 
 
def get_soup(url, **kwargs):
    response = requests.get(url, **kwargs, verify=False)
    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
        rponse = requests.get(url, verify=False)
        sp = BeautifulSoup(rponse.text, "lxml")
        document ={}
        dcs = sp(attrs={"class": "list-in article"})
        for z in dcs:
            document[z.h2.text] = list(z.ol.stripped_strings)
            # document[z.h2.text] = tuple(z.ol.stripped_strings)
 
        # в одну строку с разделителем запятая
        for z in dcs:
            document[z.h2.text] = ', '.join(z.ol.stripped_strings)
        try:
            article = [l.get_text(strip=True) for l in soup.find_all("p") if l.get_text(strip=True).startswith('Условия')]
            art = str(article).replace("['", '').replace("']", '')
        except:
            article = [l.get_text(strip=True) for l in soup.find_all("strong") if l.get_text(strip=True).startswith('Условия')]
            art = str(article).replace("['", '').replace("']", '')
        for row in soup.select('td'):
            cols = row.select('td')
            cols = [c.text.strip() for c in cols]
        item = {
            'Название': name,
            'Статус': 'Заявки не принимаются',
            'Время окончания приема заявок': amount,
            'Полное описание условий конкурса': art
        }
        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()
Он выводит предложения, начинающиеся со слов "Условия конкурса". Проблема в том, что выводит не из всех ссылок, несмотря на то, что там есть предложения, имеющие данное словосочетание. Не подскажите, где нужно исправить.

Вот фрагмент кода:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[
 {
  "Название": "Конкурс на лучшие проекты фундаментальных научных исследований, проводимых совместно российскими и китайскими учеными, проводимый совместно РФФИ и Академией общественных наук Китая",
  "Статус": "Заявки не принимаются",
  "Время окончания приема заявок": "22.01.2021 23:59",
  "Полное описание условий конкурса": "Условия конкурса для российских участников(утверждены решением бюро совета РФФИ, протокол заседания бюро совета РФФИ № 14 (241) от 12.11.2020)', 'Условиями предоставления гранта на реализацию проекта на следующий этап реализации проекта являются:",
  "Документы": {
   "Формы заявок": "Форма 35А. Содержание проекта, Форма 3. Сведения об организации, Форма 2. Данные о физическом лице, Форма 1en. Данные о проекте на английском языке, Форма 6. Предварительный бюджет проекта, Форма 1. Данные о проекте",
   "Договор и инструкции": "Инструкция по оформлению и отправке отчёта в КИАС РФФИ, Инструкция по оформлению договора о предоставлении гранта победителю конкурса и реализации научного проекта, Договор о предоставлении гранта победителю конкурса и реализации научного проекта, Инструкция по оформлению и подаче заявки в КИАС РФФИ, Инструкция по подтверждению согласия предоставлять условия для реализации проекта, Справочная информация для заполнения приложения «Сведения о выплатах, произведенных организацией...»",
   "Формы отчетов": "Форма 512. Данные о члене коллектива, Форма 511. Возможности практического использования результатов, Форма 509. Публикация по результатам проекта, Форма 503М(итог). Развернутый научный отчет, Форма 503M. Развернутый научный отчет по проектам международных конкурсов, Форма 502(итог). Краткий научный отчет на английском языке, Форма 502. Краткий научный отчет на английском языке, Форма 501(итог). Краткий научный отчет, Форма 501. Краткий научный отчет, Форма 506. Финансовый отчет, Сведения о выплатах, произведенных организацией (DOCX)"
  }
 },
 {
  "Название": "Конкурсы",
  "Статус": "Заявки не принимаются",
  "Время окончания приема заявок": "22.01.2021 23:59",
  "Полное описание условий конкурса": "[]",
  "Документы": {
   "Формы заявок": "Форма 3. Сведения об организации, Форма 2. Данные о физическом лице, Форма 1_р. Данные о проекте, Форма 4_р. Содержание проекта, Форма 6_р. Предварительный бюджет проекта",
   "Договор и инструкции": "Справочная информация для заполнения приложения «Сведения о выплатах, произведенных организацией...», Инструкция по оформлению и отправке отчёта в КИАС РФФИ, Инструкция по оформлению заявки в КИАС РФФИ, Инструкция по оформлению договора о предоставлении гранта победителю конкурса и реализации научного проекта, Договор о предоставлении гранта победителю конкурса и реализации научного проекта",
   "Формы отчетов": "Форма 512. Данные о члене коллектива, Форма 511. Возможности практического использования результатов, Форма 509. Публикация по результатам проекта, Форма 502(итог). Краткий научный отчет на английском языке, Форма 501(итог). Краткий научный отчет, Форма 506. Финансовый отчет, Форма 503 (итог). Развернутый научный отчет, Форма 520. Возможности практического использования результатов проекта РФФИ для субъекта РФ, Сведения о выплатах, произведенных организацией (DOCX)"
  }
 },
Что нужно исправить? Подскажите...

Добавлено через 16 минут
Вот ещё вариант
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import requests
import json
from bs4 import BeautifulSoup
import chardet
import xlsxwriter
import re
from datetime import date, timedelta
 
PAGES_COUNT = 100
OUT_FILENAME = 'out.json'
 
import warnings
warnings.filterwarnings("ignore")
 
 
def get_soup(url, **kwargs):
    response = requests.get(url, **kwargs, verify=False)
    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
        rponse = requests.get(url, verify=False)
        sp = BeautifulSoup(rponse.text, "lxml")
        document ={}
        dcs = sp(attrs={"class": "list-in article"})
        for z in dcs:
            document[z.h2.text] = list(z.ol.stripped_strings)
            # document[z.h2.text] = tuple(z.ol.stripped_strings)
 
        # в одну строку с разделителем запятая
        for z in dcs:
            document[z.h2.text] = ', '.join(z.ol.stripped_strings)
        article = [l.get_text(strip=True) for l in soup.find_all("p") if l.get_text(strip=True).startswith('Условия')]
        art = str(article).replace("['", '').replace("']", '')
        for row in soup.select('td'):
            cols = row.select('td')
            cols = [c.text.strip() for c in cols]
        item = {
            'Название': name,
            'Статус': 'Заявки не принимаются',
            'Время окончания приема заявок': amount,
            'Полное описание условий конкурса': art
        }
        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()
Но тоже не всё выводит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.06.2023, 14:15
Помогаю со студенческими работами здесь

Как вывести на страницу Html файл Json в котором есть сотрудники
суть вопроса как вывести на страницу html Это json Файл учтя что есть Idfrom idto не могу понять как мне написать html file который будет...

Файлы: вывести текст на экран; по нажатию клавиши выделить каждое предложение текста
Помогите пожалуста на завтра очень нужно сделать. Нужно создать текстовый файл(.dat) в нем должно быть три предложения. Написать...

Как выделить определенное количество памяти?
как выделить определенное количество памяти? (С#) какую структуру лучше использовать? список? стек или еще что можно? Разработать...

Как вытащить из Json определенное значение?
Всем привет, всех с новым годом подскажите пожалуйста. Есть код &lt;?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,...

Как выделить определенное поле формы, чтобы потом изменить его свойства?
Здравствуйте. Ситуация такая: есть форма(F_Printer) в ней более 30 полей. При двойном нажатии на поле появляется другая форма (Gr_1_1),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru