Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 09.01.2025
Сообщений: 9

Парсинг динамической страницы

11.01.2025, 11:02. Показов 3477. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, уважаемые форумчане! Я новичок в программировании. Помогите правильно написать код. Не получается вынуть имя Ирина З из <div class="outcomes-desktop-player flex w-100 flex-grow items-center justify-end overflow-auto outcomes-desktop-player-active"><span class="mb-0_5 truncate">Ирина З.</span></div> код страницы периодически меняется соответственно и имена. Про бовал bs4 и selenium. Не помогло. Пишет Имя не найдено. Вот код на питоне.
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
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from bs4 import BeautifulSoup
import time
 
# Указываем путь к драйверу Chrome (например, chromedriver.exe)
driver_path = 'E:/PythonProject/Bot/chromedriver/chromedriver.exe'
 
# Настраиваем параметры запуска Chrome
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')  # Если хотите запускать браузер в фоновом режиме
 
# Создаем объект Service для указания пути к драйверу
webdriver_service = Service(driver_path)
 
# Запускаем браузер Chrome через Selenium
browser = webdriver.Chrome(service=webdriver_service, options=chrome_options)
 
# Открываем нужную страницу
url = 'https://pari.ru/quick-games/nard'
browser.get(url)
 
# Ждем несколько секунд, пока загрузится динамический контент
time.sleep(20)
 
# Получаем HTML-код после полной загрузки страницы
page_source = browser.page_source
 
# Закрываем браузер
browser.quit()
 
# Парсим HTML с помощью BeautifulSoup
soup = BeautifulSoup(page_source, 'html.parser')
 
# Находим элемент span с классом mb-0_5
name_element = soup.find('span', class_='mb-0_5 truncate')
 
# Извлекаем текст из элемента
if name_element:
    name = name_element.text.strip()
    print(f'Имя игрока: {name}')
else:
    print("Имя не найдено")
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.01.2025, 11:02
Ответы с готовыми решениями:

Парсинг страницы
from urllib.request import urlopen from bs4 import BeautifulSoup import re def get_links(url): html = urlopen(url) ...

Парсинг страницы
Здравствуйте! Столкнулся с такой проблемой, что не могу спарсить страницу. Я использовал BeautifulSoup для парсинга, но суть проблемы в...

Парсинг html страницы
хочу сделать автоматическое скачивание файлов по ключевому слову на картинке есть кнопка которая выдаёт ссылку на скачку(первая...

15
 Аватар для ViachaslauK
122 / 179 / 16
Регистрация: 08.10.2024
Сообщений: 617
11.01.2025, 13:46
А в консоли брузера, в разработчике вы можете найти по этому пути элемент?
0
1 / 1 / 0
Регистрация: 09.01.2025
Сообщений: 9
11.01.2025, 15:10  [ТС]
да, оттуда я как раз этот блок и взял <div class="outcomes-desktop-player flex w-100 flex-grow items-center justify-end overflow-auto outcomes-desktop-player-active"><span class="mb-0_5 truncate">Ирина З.</span></div>

Я подозреваю, что проблема в этой команде
# Парсим HTML с помощью BeautifulSoup
soup = BeautifulSoup(page_source, 'html.parser')

поскольку выше указанный динамичный блок, скрытый или заблокированный в коде страницы которая находится в переменной soup, по тому что другие видимые элементы этой страницы достать удавалось.

Возможно кто то уже сталкивался с такой проблемой?
0
 Аватар для ViachaslauK
122 / 179 / 16
Регистрация: 08.10.2024
Сообщений: 617
11.01.2025, 15:53
Цитата Сообщение от Роман9571 Посмотреть сообщение
да, оттуда я как раз этот блок и взял <div class="outcomes-desktop-player flex w-100 flex-grow
Конкретно, можете привести команду в консоли, которой вы получаете этот блок? То есть Elements, shift+F и что вы вводите в фильтр, чтобы получить этот элемент. Динамические блоки с помощью селениума должны браться. Но я давно с ним не работал. Если подозреваете что это скрытый элемент, погуглите про shadow dom и как с ним работать. Иногда помогает

Добавлено через 36 минут
возможно контент не успевает прогружаться еще. Почитай тут
https://stackoverflow.com/ques... teractable
0
1 / 1 / 0
Регистрация: 09.01.2025
Сообщений: 9
11.01.2025, 17:00  [ТС]
просто навожу на элемент пр.к.мыши посмотреть код, открывается тот блок в котором хранится нужный элемент, копирую в блокнот, там выбираю нужный класс, и вставляю в код питона
0
 Аватар для ViachaslauK
122 / 179 / 16
Регистрация: 08.10.2024
Сообщений: 617
11.01.2025, 22:03
Лучший ответ Сообщение было отмечено Роман9571 как решение

Решение

Цитата Сообщение от Роман9571 Посмотреть сообщение
просто навожу на элемент пр.к.мыши посмотреть код, открывается тот блок в котором хранится нужный элемент, копирую в блокнот, там выбираю нужный класс, и вставляю в код питона
Вообще то дебажится не так а через поиск. Но не в этом деле. Скорее всего на страницу подгружается ифрэйм ч другим адресом, поэтому ты ничего не можешь получить с помощью прямого парсинга. Я давно не занимался парсингом и могу не помнить, но скорее всего тебе в девелоперс во вкладке Network нужно найти что туда подгружается - с какого урла, переходить на него и парсить содержимое. Погугли как парсить ифрэймы, у меня к сожалению не сохранилсяь инфа.

PS - точно там есть iframe
тебе нужно что-то вроде такого кода:
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
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
 
def fetch_data(url):
    chrome_service = Service("путь к драйверу/Python-Preparations/parser/chromedriver-mac-x64/chromedriver")  # Update this path
    driver = webdriver.Chrome(service=chrome_service)
    driver.get(url)
 
    try:
        # Wait until the iframe is present
        WebDriverWait(driver, 20).until(
            EC.presence_of_element_located((By.TAG_NAME, "iframe"))
        )
 
        # Switch to the iframe
        iframe = driver.find_element(By.TAG_NAME, "iframe")
        driver.switch_to.frame(iframe)
 
        # Wait until the element with class 'outcomes-desktop-player' is present within the iframe
        WebDriverWait(driver, 20).until(
            EC.presence_of_element_located((By.CLASS_NAME, "outcomes-desktop-player"))
        )
 
        # Get the page source after the JavaScript has rendered the content
        page_source = driver.page_source
        soup = BeautifulSoup(page_source, 'html.parser')
 
        # Adjust the selector based on the actual HTML structure
        player_name_element = soup.select_one('.outcomes-desktop-player')
        if player_name_element:
            player_name = player_name_element.text.strip()
            print(f"Player name: {player_name}")
        else:
            print("Player name element not found")
    except Exception as e:
        print(f"Error fetching player name: {e}")
    finally:
        driver.quit()
 
if __name__ == "__main__":
    url = "https://pari.ru/quick-games/nard"
    fetch_data(url)
Добавлено через 5 минут
У меня этот код парсит имя

Добавлено через 58 секунд
Учитывай что там несколько дивов с этим классом, если тебе нужен второй игрок - перебор нужен
0
1 / 1 / 0
Регистрация: 09.01.2025
Сообщений: 9
12.01.2025, 10:10  [ТС]
Все получилось. Огромное СПАСИБО!!! Про цикл перебора знаю, мне просто нужно было с этим моментом разобраться, дальше я сам справлюсь, еще раз спасибо!
1
 Аватар для ViachaslauK
122 / 179 / 16
Регистрация: 08.10.2024
Сообщений: 617
12.01.2025, 11:19
Цитата Сообщение от Роман9571 Посмотреть сообщение
Все получилось. Огромное СПАСИБО!!!
Welcome) Было интересно вспомнить, года два назад я по заказу бизнес аналитиков за 3 месяца написал примерно 60 парсеров, там прям всякие попадались) Руки то помнят, если что, обращайтесь)
0
1 / 1 / 0
Регистрация: 09.01.2025
Сообщений: 9
14.01.2025, 20:38  [ТС]
ViachaslauK, Доброго времени суток, подскажите, возможно вытащить данные с сайта если код очень быстро меняется? В моем случае игральные кости. Пробовал взять за основу ваш код - не получилось.
0
 Аватар для ViachaslauK
122 / 179 / 16
Регистрация: 08.10.2024
Сообщений: 617
15.01.2025, 10:27
Роман9571, Что именно не получилось, я не ведун). Писал парсер для автоукционов с отслеживанием цены. Там beautyfulsoap не использовал, все через вебдрйвер делал. Просто запускал в цикле парсинг страницы, каждые 30 секунд в моем случае было достаточно. Погугли, может есть в селениуме что то типа Webdriverwait, который можно привязать к отслеживанию изменения элемента

Добавлено через 13 минут
Тут можно на чистом селениуме
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
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
 
def fetch_data(url):
    chrome_service = Service("/Users/Viachaslau_Kazakou/Work/Python-Preparations/parser/chromedriver-mac-x64/chromedriver")  # Update this path
    driver = webdriver.Chrome(service=chrome_service)
    driver.get(url)
 
    try:
        # Wait until the iframe is present
        WebDriverWait(driver, 20).until(
            EC.presence_of_element_located((By.TAG_NAME, "iframe"))
        )
 
        # Switch to the iframe
        iframe = driver.find_element(By.TAG_NAME, "iframe")
        driver.switch_to.frame(iframe)
 
        # Wait until the element with class 'outcomes-desktop-player' is present within the iframe
        WebDriverWait(driver, 20).until(
            EC.presence_of_element_located((By.CLASS_NAME, "outcomes-desktop-player"))
        )
 
        # Extract player name using Selenium
        player_name_element = driver.find_element(By.CLASS_NAME, "outcomes-desktop-player")
        player_name = player_name_element.text.strip()
        print(f"Player name: {player_name}")
 
        # Monitor the changes in the 'bet-value' element
        previous_value = None
        start_time = time.time()
        duration = 60  # Monitor for 60 seconds
 
        while time.time() - start_time < duration:
            bet_value_element = driver.find_element(By.CLASS_NAME, "bet-value")
            current_value = bet_value_element.text.strip()
            if current_value != previous_value:
                print(f"New bet value: {current_value}")
                previous_value = current_value
            time.sleep(1)  # Adjust the sleep time as needed
 
    except Exception as e:
        print(f"Error fetching data: {e}")
    finally:
        driver.quit()
 
if __name__ == "__main__":
    url = "https://pari.ru/quick-games/nard"
    fetch_data(url)
bet-value - это тебе нужно подставить нужную ячейку гд меняются ставки. Не проверял, это примерный код
0
1 / 1 / 0
Регистрация: 09.01.2025
Сообщений: 9
15.01.2025, 22:51  [ТС]
пробовал разные варианты, но с игральной костью ситуация другая <div class="dice dice-outcome relative dice-6 outcome-item-dice shrink-0"> переменная игральной кости расположена внутри в данном случае это 6 за основу брал ваш код

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
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import re
 
 
def fetch_data(url):
    chrome_service = Service(
        "E:/PythonProject/Bot/chromedriver/chromedriver.exe")  # Путь к драйверу
 
    driver = webdriver.Chrome(service=chrome_service)
    driver.get(url)
 
    try:
        # Подождать появления iframe
        WebDriverWait(driver, 20).until(
            EC.presence_of_element_located((By.TAG_NAME, "iframe"))
        )
 
        # Переключение на iframe
        iframe = driver.find_element(By.TAG_NAME, "iframe")
        driver.switch_to.frame(iframe)
 
        # Ожидание загрузки содержимого iframe
        WebDriverWait(driver, 20).until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".dice-outcome"))
        )
 
        # Получение исходного кода страницы
        page_source = driver.page_source
        soup = BeautifulSoup(page_source, 'html.parser')
 
        # Поиск всех элементов с костями
        dice_elements = soup.select(".dice-outcome")
 
        for element in dice_elements:
            try:
                # Извлечение класса вида "dice-N"
                classes = element.attrs['class']
 
                # Найти класс, начинающийся с "dice-"
                dice_class = next((cls for cls in classes if cls.startswith('dice-')), None)
 
                if dice_class is not None:
                    # Извлечение числа из класса
                    numbers = re.findall(r'\d+', dice_class)
 
                    if numbers:
                        number = int(numbers[0])  # Берём первую найденную цифру
                        print(f"Значение кости: {number}")
                    else:
                        print(f"Не найдено числа в классе '{dice_class}'")
            except Exception as e:
                print(f"Ошибка при обработке элемента: {e}")
 
    except Exception as e:
        print(f"Ошибка при получении значений костей: {e}")
    finally:
        driver.quit()
 
 
if __name__ == "__main__":
    url = "https://pari.ru/quick-games/nard"
    fetch_data(url)
Необходимо вытащить все кости которые находятся на экране.
Если есть время подправить код буду благодарен!
0
1 / 1 / 0
Регистрация: 09.01.2025
Сообщений: 9
21.01.2025, 21:55  [ТС]
ViachaslauK, Доброго времени суток. Если есть время посмотреть код, много вариантов перепробовал, пока переменная списка my_list заполнена, она перезаписывается в txt файл (как запланировано), но когда переменная списка my_list пустая должна перейти на несколько строк ниже и там продолжить создавать следующий список с перезаписью, а в место этого он вновь перезаписывает с начала.
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
 while True:
            blue_numbers, red_numbers = fetch_data(driver, url)
            print("Синие   : ", blue_numbers)
            print("Красные : ", red_numbers)
 
            # Разделение списков на четные и нечетные позиции
            even_blue, odd_blue = split_list(blue_numbers)
            even_red, odd_red = split_list(red_numbers)
 
            # Проверка длины списков
            if len(blue_numbers) % 2 != 0 or len(red_numbers) % 2 != 0:
                my_list = [
                    "Синие   1: " + str(odd_blue),
                    "Красные 1: " + str(odd_red),
                    "\n",
                    "Синие   2: " + str(even_blue),
                    "Красные 2: " + str(even_red),
                    "\n"]
            else:
                my_list = [
                    "Синие   1: " + str(even_blue),
                    "Красные 1: " + str(even_red),
                    "\n",
                    "Синие   2: " + str(odd_blue),
                    "Красные 2: " + str(odd_red),
                    "\n"
                ]
                
                if len(my_list) > 0:
                    with open("output_utf8.txt", "w", encoding="utf-8") as file:
                        for item1 in my_list:
                            file.write(str(item1) + "\n")
                else:
                    if len(my_list) == 0:
                        # Если список пуст, проверяем наличие данных в файле
                        try:
                            with open("output_utf8.txt", "r+", encoding="utf-8") as file:
                                content = file.read().strip()
                                #print(content)
                                # Если файл содержит данные, добавляем 4 пустые строки
                                if content:
                                    file.write("\n\n\n\n", 'следующий')
                        finally:
                            # Как только список обновляется, записываем новые данные
                            for item1 in my_list:
                                file.write(str(item1) + "\n")
пример тхт файла
Синие 1: [1, 6, 5, 3, 1, 3, 4, 3, 5, 5, 5, 5]
Красные 1: [5, 5, 5, 6, 1, 1, 6, 6, 5, 2, 3, 4]


Синие 2: [1, 5, 4, 1, 2, 5, 2, 2, 6, 1, 1, 1]
Красные 2: [3, 4, 5, 3, 4, 4, 2, 2, 5, 6, 3, 6] вот так выглядит на данный момент

а должен продолжать в низ вести запись. Заранее спасибо!
0
 Аватар для ViachaslauK
122 / 179 / 16
Регистрация: 08.10.2024
Сообщений: 617
21.01.2025, 22:49
Цитата Сообщение от Роман9571 Посмотреть сообщение
Если есть время посмотреть код,
Очень много работы эти дни, но я постараюсь глянуть
0
1 / 1 / 0
Регистрация: 09.01.2025
Сообщений: 9
15.02.2025, 20:32  [ТС]
ViachaslauK, Доброго времени суток. Если работал с компиляцией в ехе файл может подскажешь что нужно, не получается правильно сделать, в pyinstaller делаю Stat_interface.py - это стартовый модуль -
кнопочный интерфейс оттуда запускается модуль Pars_nards.py и открываются кнопками файлы result_M9.csv
result_B5.csv
Диапазон Б5.xlsx
Диапазон М9.xlsx
test_play.txt , а модули range_M9.py и range_B5.py запускаются в процессе работы модуля Pars_nards.py
вот код сборки Stat_interface.spec
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
# -*- mode: python ; coding: utf-8 -*-
 
block_cipher = None
 
 
a = Analysis(
    ['Stat_interface.py'],  # Основной скрипт
    pathex=[r'E:\\PythonProject\\Bot\\'],  # Путь к проекту
    binaries=[
        ('chromedriver\\chromedriver.exe', '.'),  # Драйвер Chrome
    ],
    datas=[
        ('Pars_nards.py', '.'),  # Скрипт Pars_nards.py
        ('range_M9.py', '.'),  # Скрипт range_M9.py
        ('range_B5.py', '.'),  # Скрипт range_B5.py
        ('result_M9.csv', '.'),  # Файл result_M9.csv
        ('result_B5.csv', '.'),  # Файл result_B5.csv
        ('Диапазон Б5.xlsx', '.'),  # Файл Диапазон Б5.xlsx
        ('Диапазон М9.xlsx', '.'),  # Файл Диапазон М9.xlsx
        ('test_play.txt', '.'),  # Файл test_play.txt
    ],
    hiddenimports=[],  # Скрытые импорты, если нужны
    hookspath=None,
    runtime_hooks=None,
)
 
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
 
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='Stat_interface',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )  # Включаем консоль, если нужен вывод в консоль
на выходе папка dist пустая,а в папке build есть файл ехе, но не работает, сборку пробовал делал выйдя из вирт. пространства и в нем. Может что подскажешь? Заранее спасибо!
0
 Аватар для ViachaslauK
122 / 179 / 16
Регистрация: 08.10.2024
Сообщений: 617
16.02.2025, 12:11
Цитата Сообщение от Роман9571 Посмотреть сообщение
ViachaslauK, Доброго времени суток. Если работал с компиляцией в ехе файл может подскажешь что нужно
К сожалению, нет, я уже лет 7 не работаю в принципе с виндой
0
1 / 1 / 0
Регистрация: 09.01.2025
Сообщений: 9
16.02.2025, 12:55  [ТС]
ViachaslauK, Я понял. Но все равно спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.02.2025, 12:55
Помогаю со студенческими работами здесь

Ускорить парсинг страницы
Всем привет. Пишу парсер, все ок, все работает. Но, работает ДОЛГО. На одну функцию уходит больше 2 секунд, а их там 4 -_- from bs4...

Парсинг страницы
Здравствуйте,требуется написать программу на языке Python , которая парсит с сайта &quot;Викисловарь&quot; значение любого слова.

Парсинг страницы
Здравствуйте! Есть проблема с получением информации с сайта. Отрывок кода страницы: &lt;div class='lesson lesson-lecture'...

Парсинг страницы
Добрый вечер) Может кто подсказать. Я пытаюсь вытащить из страницы вот этот тег: &lt;dd...

Парсинг html страницы
Лаборатория 1. Осуществить ввод адреса Интернет-страницы. 2. Осуществить поиск всех изображений на странице. 3. Удалить дубликаты. ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru