<b>Здравствуйте</b> <br/><br/> У меня есть файл с определённой структурой, который я хочу распарсить с помощью <b>python</b>. Мне нужно извлечь названия программ и их версии. Формат файла всегда будет одинаковым, но количество программ в нём может варьироваться. Для этой задачи я использую библиотеку <b>BeautifulSoup</b>. <br/><br/> <pre><code class="html"><!-- SW --><TABLE WIDTH=100%><TD CLASS=pt><A NAME="installed programs">Установленные программы</A><TR><TD><HR></TABLE><TABLE><TR><TD WIDTH=16>&nbsp;<TD WIDTH=16><TD><TD><TD><TD><TD><TD> <TR><TD><TD><TD><B>Программа</B>&nbsp;&nbsp;<TD CLASS=cr><B>Версия</B>&nbsp;&nbsp;<TD CLASS=cr><B>Размер</B>&nbsp;&nbsp;<TD><B>GUID</B>&nbsp;&nbsp;<TD><B>Издатель</B>&nbsp;&nbsp;<TD CLASS=cr><B>Дата</B> <TR><TD><TD><TD>64 Bit HP CIO Components Installer&nbsp;&nbsp;<TD CLASS=cr>16.2.1&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>{F8F948EA-5AEA-4158-8821-A2F788ECE936}&nbsp;&nbsp;<TD>Hewlett-Packard&nbsp;&nbsp;<TD CLASS=cr>2023-05-18 <TR><TD><TD><TD>HP LaserJet Pro M201-M202&nbsp;&nbsp;<TD CLASS=cr>15.0.16064.399&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>{e71f6d30-080d-43ef-87e0-1ac4d7f8adfa}&nbsp;&nbsp;<TD>Hewlett-Packard&nbsp;&nbsp;<TD CLASS=cr> <TR><TD
Для парсинга HTML-файла с помощью библиотеки Beautiful Soup, мы можем использовать следующий подход. Предположим, у нас есть HTML-код, аналогичный вашему примеру, и мы хотим извлечь названия программ и их версии. Вот примерный код, который выполняет эту задачу: ```python from bs4 import BeautifulSoup # Ваш HTML-код (возможно, вы загрузите его из файла) html_code = """ <!-- SW --><TABLE WIDTH=100%><TD CLASS=pt><A NAME="installed programs">Установленные программы</A><TR><TD><HR></TABLE><TABLE><TR><TD WIDTH=16> <TD WIDTH=16><TD><TD><TD><TD><TD><TD> <TR><TD><TD><TD><B>Программа</B> <TD CLASS=cr><B>Версия</B> <TD CLASS=cr><B>Размер</B> <TD><B>GUID</B> <TD><B>Издатель</B> <TD CLASS=cr><B>Дата</B> <TR><TD><TD><TD>64 Bit HP CIO Components Installer <TD CLASS=cr>16.2.1 <TD CLASS=cr>Неизвестно <TD>{F8F948EA-5AEA-4158-8821-A2F788ECE936} <TD>Hewlett-Packard <TD CLASS=cr>2023-05-18 <TR><TD><TD><TD>HP LaserJet Pro M201-M202 <TD CLASS=cr>15.0.16064.399 <TD CLASS=cr>Неизвестно <TD>{e71f6d30-080d-43ef-87e0-1ac4d7f8adfa} <TD>Hewlett-Packard <TD CLASS=cr> """ # Создаем объект BeautifulSoup soup = BeautifulSoup(html_code, 'html.parser') # Находим все строки таблицы (TR), начиная с третьей (первая строка - заголовок) programs = [] for row in soup.find_all('tr')[2:]: # пропускаем первые две строки cells = row.find_all('td') if len(cells) > 2: # проверяем, есть ли достаточное количество ячеек program_name = cells[2].get_text(strip=True) # Название программы version = cells[3].get_text(strip=True) # Версия programs.append({'name': program_name, 'version': version}) # Выводим результат for program in programs: print(f"Программа: {program['name']}, Версия: {program['version']}") ``` ### Объяснение кода: 1. **Импортируем библиотеку**: Импортируем `BeautifulSoup` из библиотеки `bs4`. 2. **HTML-код**: Мы предполагаем, что HTML-код ранее был загружен. В реальном сценарии вы можете загружать HTML из файла или использовать `requests` для извлечения HTML с веб-страницы. 3. **Создаем объект BeautifulSoup**: Мы создаем объект `soup`, который позволяет нам легко обращаться к элементам HTML. 4. **Поиск программ**: Используя `soup.find_all`, мы находим все строки (`<tr>`). Мы пропускаем первые две строки, поскольку они содержат заголовки. 5. **Извлечение данных**: В цикле мы извлекаем содержимое ячеек (`<td>`) и добавляем названия программ и их версии в список словарей. 6. **Вывод результата**: Мы перебираем список программ и выводим название и версию каждой программы. Этот код должен работать с вашим HTML-файлом, если его формат соответствует представленному примеру. Если у вас другие поля, такие как "Размер", "GUID", "Издатель", вы также можете извлечь их аналогичным образом, изменив индексы в массиве `cells`.
У тебя всегда таблица в htnl используй подходящуюю структуру данных пандас датафрейм.
import pandas as pd from io import StringIO html = '''<!-- SW --><TABLE WIDTH=100%><TD CLASS=pt><A NAME="installed programs">Установленные программы</A><TR><TD><HR></TABLE><TABLE><TR><TD WIDTH=16> <TD WIDTH=16><TD><TD><TD><TD><TD><TD> <TR><TD><TD><TD><B>Программа</B> <TD CLASS=cr><B>Версия</B> <TD CLASS=cr><B>Размер</B> <TD><B>GUID</B> <TD><B>Издатель</B> <TD CLASS=cr><B>Дата</B> <TR><TD><TD><TD>64 Bit HP CIO Components Installer <TD CLASS=cr>16.2.1 <TD CLASS=cr>Неизвестно <TD>{F8F948EA-5AEA-4158-8821-A2F788ECE936} <TD>Hewlett-Packard <TD CLASS=cr>2023-05-18 <TR><TD><TD><TD>HP LaserJet Pro M201-M202 <TD CLASS=cr>15.0.16064.399 <TD CLASS=cr>Неизвестно <TD>{e71f6d30-080d-43ef-87e0-1ac4d7f8adfa} <TD>Hewlett-Packard <TD CLASS=cr> <TR><TD><TD><TD>HP Unified IO <TD CLASS=cr>2.0.0.434 <TD CLASS=cr>Неизвестно <TD>{F1390872-2500-4408-A46C-CD16C960C661} <TD>HP <TD CLASS=cr>2023-05-18 <TR><TD><TD><TD>HP Update <TD CLASS=cr>5.005.002.002 <TD CLASS=cr>Неизвестно <TD>{912D30CF-F39E-4B31-AD9A-123C6B794EE2} <TD>Hewlett-Packard <TD CLASS=cr>2023-05-18 <TR><TD><TD><TD>Mesh Agent <TD CLASS=cr>2022-12-02 22:42:16.000+03:00 <TD CLASS=cr>Неизвестно <TD>Mesh Agent <TD> <TD CLASS=cr> <TR><TD><TD><TD>Microsoft Edge <TD CLASS=cr>132.0.2957.115 <TD CLASS=cr>Неизвестно <TD>Microsoft Edge <TD>Корпорация Майкрософт <TD CLASS=cr>2025-01-20 <TR><TD><TD><TD>Microsoft Office LTSC профессиональный плюс 2021 - ru-ru <TD CLASS=cr>16.0.14332.20345 <TD CLASS=cr>Неизвестно <TD>ProPlus2021Volume - ru-ru <TD>Microsoft Corporation <TD CLASS=cr> <TR><TD><TD><TD>Microsoft Update Health Tools <TD CLASS=cr>3.74.0.0 <TD CLASS=cr>Неизвестно <TD>{1FC1A6C2-576E-489A-9B4A-92D21F542136} <TD>Microsoft Corporation <TD CLASS=cr>2023-11-14 <TR><TD><TD><TD>Mozilla Firefox (x64 ru) <TD CLASS=cr>134.0.1 <TD CLASS=cr>Неизвестно <TD>Mozilla Firefox 134.0.1 (x64 ru) <TD>Mozilla <TD CLASS=cr> <TR><TD><TD><TD>Mozilla Maintenance Service <TD CLASS=cr>113.0.1 <TD CLASS=cr>Неизвестно <TD>MozillaMaintenanceService <TD>Mozilla <TD CLASS=cr> <TR><TD><TD><TD>Office 16 Click-to-Run Extensibility Component <TD CLASS=cr>16.0.14332.20345 <TD CLASS=cr>Неизвестно <TD>{90160000-008C-0000-1000-0000000FF1CE} <TD>Microsoft Corporation <TD CLASS=cr>2023-05-18 <TR><TD><TD><TD>Office 16 Click-to-Run Licensing Component <TD CLASS=cr>16.0.14332.20345 <TD CLASS=cr>Неизвестно <TD>{90160000-007E-0000-1000-0000000FF1CE} <TD>Microsoft Corporation <TD CLASS=cr>2023-05-18 <TR><TD><TD><TD>Office 16 Click-to-Run Localization Component [Русский (Россия)] <TD CLASS=cr>16.0.14332.20281 <TD CLASS=cr>Неизвестно <TD>{90160000-008C-0419-1000-0000000FF1CE} <TD>Microsoft Corporation <TD CLASS=cr>2023-05-18 <TR><TD><TD><TD>STDU Viewer version 1.6.361.0 <TD CLASS=cr>1.6.361.0 <TD CLASS=cr>Неизвестно <TD>STDU Viewer_is1 <TD>STDUtility <TD CLASS=cr>2023-05-18 <TR><TD><TD><TD>Update for x64-based Windows Systems (KB5001716) <TD CLASS=cr>8.94.0.0 <TD CLASS=cr>Неизвестно <TD>{DA80A019-4C3B-4DAA-ACA1-6937D7CAAF9E} <TD>Microsoft Corporation <TD CLASS=cr>2024-10-16 <TR><TD><TD><TD>VixWin Platinum <TD CLASS=cr>3.50.000 <TD CLASS=cr>Неизвестно <TD>{81695582-88F8-47A6-8431-C10617AF058A} <TD>Gendex <TD CLASS=cr>2023-05-19 <TR><TD><TD><TD>WinRAR 6.21 (64-разрядная) <TD CLASS=cr>6.21.0 <TD CLASS=cr>Неизвестно <TD>WinRAR archiver <TD>win.rar GmbH <TD CLASS=cr> <TR><TD><TD><TD>КриптоПро CSP <TD CLASS=cr>5.0.12330 <TD CLASS=cr>Неизвестно <TD>{50F91F80-D397-437C-B0C8-62128DE3B55E} <TD>Компания КриптоПро <TD CLASS=cr>2023-05-18 <TR><TD><TD><TD>КриптоПро ЭЦП Browser plug-in [Русский (Россия)] <TD CLASS=cr>2.0.14816 <TD CLASS=cr>Неизвестно <TD>{E12CC7EE-36B7-4AAA-924E-2F5CD75BCECF} <TD>Компания КриптоПро <TD CLASS=cr>2023-05-18 <TR><TD><TD><TD>Платные услуги К1-1 <TD CLASS=cr>0.1 <TD CLASS=cr>Неизвестно <TD>{E59C5221-50B3-420C-84C0-DF40A1AC280E} <TD>Maximus <TD CLASS=cr>2023-05-18 <TR><TD><TD><TD>Среда выполнения Microsoft Edge WebView2 Runtime <TD CLASS=cr>131.0.2903.146 <TD CLASS=cr>Неизвестно <TD>Microsoft EdgeWebView <TD>Корпорация Майкрософт <TD CLASS=cr>2025-01-16 </TABLE><BR><BR> ''' table = pd.read_html(StringIO(html),header=[1])[0] print(table)
Все задача решается в одну строчку кодаtable = pd.read_html(StringIO(html),header=[1])[0]
затем выбираешь нужные тебе колонки, параметр header это с какой строки считать имя колонок, на другом примере его значение может, отличатся, по этому можешь его опустить, а выяснить нужные локации колонок, уже после.