Как можно распарсить файл в табличном формате с помощью библиотеки Beautiful Soup?

<b>Здравствуйте</b> <br/><br/> У меня есть файл с определённой структурой, который я хочу распарсить с помощью <b>python</b>. Мне нужно извлечь названия программ и их версии. Формат файла всегда будет одинаковым, но количество программ в нём может варьироваться. Для этой задачи я использую библиотеку <b>BeautifulSoup</b>. <br/><br/> <pre><code class="html">&lt;!-- SW --&gt;&lt;TABLE WIDTH=100%&gt;&lt;TD CLASS=pt&gt;&lt;A NAME="installed programs"&gt;Установленные программы&lt;/A&gt;&lt;TR&gt;&lt;TD&gt;&lt;HR&gt;&lt;/TABLE&gt;&lt;TABLE&gt;&lt;TR&gt;&lt;TD WIDTH=16&gt;&amp;nbsp;&lt;TD WIDTH=16&gt;&lt;TD&gt;&lt;TD&gt;&lt;TD&gt;&lt;TD&gt;&lt;TD&gt;&lt;TD&gt;
&lt;TR&gt;&lt;TD&gt;&lt;TD&gt;&lt;TD&gt;&lt;B&gt;Программа&lt;/B&gt;&amp;nbsp;&amp;nbsp;&lt;TD CLASS=cr&gt;&lt;B&gt;Версия&lt;/B&gt;&amp;nbsp;&amp;nbsp;&lt;TD CLASS=cr&gt;&lt;B&gt;Размер&lt;/B&gt;&amp;nbsp;&amp;nbsp;&lt;TD&gt;&lt;B&gt;GUID&lt;/B&gt;&amp;nbsp;&amp;nbsp;&lt;TD&gt;&lt;B&gt;Издатель&lt;/B&gt;&amp;nbsp;&amp;nbsp;&lt;TD CLASS=cr&gt;&lt;B&gt;Дата&lt;/B&gt;
&lt;TR&gt;&lt;TD&gt;&lt;TD&gt;&lt;TD&gt;64 Bit HP CIO Components Installer&amp;nbsp;&amp;nbsp;&lt;TD CLASS=cr&gt;16.2.1&amp;nbsp;&amp;nbsp;&lt;TD CLASS=cr&gt;Неизвестно&amp;nbsp;&amp;nbsp;&lt;TD&gt;{F8F948EA-5AEA-4158-8821-A2F788ECE936}&amp;nbsp;&amp;nbsp;&lt;TD&gt;Hewlett-Packard&amp;nbsp;&amp;nbsp;&lt;TD CLASS=cr&gt;2023-05-18
&lt;TR&gt;&lt;TD&gt;&lt;TD&gt;&lt;TD&gt;HP LaserJet Pro M201-M202&amp;nbsp;&amp;nbsp;&lt;TD CLASS=cr&gt;15.0.16064.399&amp;nbsp;&amp;nbsp;&lt;TD CLASS=cr&gt;Неизвестно&amp;nbsp;&amp;nbsp;&lt;TD&gt;{e71f6d30-080d-43ef-87e0-1ac4d7f8adfa}&amp;nbsp;&amp;nbsp;&lt;TD&gt;Hewlett-Packard&amp;nbsp;&amp;nbsp;&lt;TD CLASS=cr&gt;
&lt;TR&gt;&lt;TD
  • 7 марта 2025 г. 12:24
Ответы на вопрос 2
Для парсинга 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>&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>
"""

# Создаем объект 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>&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><TD><TD>HP Unified IO&nbsp;&nbsp;<TD CLASS=cr>2.0.0.434&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>{F1390872-2500-4408-A46C-CD16C960C661}&nbsp;&nbsp;<TD>HP&nbsp;&nbsp;<TD CLASS=cr>2023-05-18
<TR><TD><TD><TD>HP Update&nbsp;&nbsp;<TD CLASS=cr>5.005.002.002&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>{912D30CF-F39E-4B31-AD9A-123C6B794EE2}&nbsp;&nbsp;<TD>Hewlett-Packard&nbsp;&nbsp;<TD CLASS=cr>2023-05-18
<TR><TD><TD><TD>Mesh Agent&nbsp;&nbsp;<TD CLASS=cr>2022-12-02 22:42:16.000+03:00&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>Mesh Agent&nbsp;&nbsp;<TD>&nbsp;&nbsp;<TD CLASS=cr>
<TR><TD><TD><TD>Microsoft Edge&nbsp;&nbsp;<TD CLASS=cr>132.0.2957.115&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>Microsoft Edge&nbsp;&nbsp;<TD>Корпорация Майкрософт&nbsp;&nbsp;<TD CLASS=cr>2025-01-20
<TR><TD><TD><TD>Microsoft Office LTSC профессиональный плюс 2021 - ru-ru&nbsp;&nbsp;<TD CLASS=cr>16.0.14332.20345&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>ProPlus2021Volume - ru-ru&nbsp;&nbsp;<TD>Microsoft Corporation&nbsp;&nbsp;<TD CLASS=cr>
<TR><TD><TD><TD>Microsoft Update Health Tools&nbsp;&nbsp;<TD CLASS=cr>3.74.0.0&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>{1FC1A6C2-576E-489A-9B4A-92D21F542136}&nbsp;&nbsp;<TD>Microsoft Corporation&nbsp;&nbsp;<TD CLASS=cr>2023-11-14
<TR><TD><TD><TD>Mozilla Firefox (x64 ru)&nbsp;&nbsp;<TD CLASS=cr>134.0.1&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>Mozilla Firefox 134.0.1 (x64 ru)&nbsp;&nbsp;<TD>Mozilla&nbsp;&nbsp;<TD CLASS=cr>
<TR><TD><TD><TD>Mozilla Maintenance Service&nbsp;&nbsp;<TD CLASS=cr>113.0.1&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>MozillaMaintenanceService&nbsp;&nbsp;<TD>Mozilla&nbsp;&nbsp;<TD CLASS=cr>
<TR><TD><TD><TD>Office 16 Click-to-Run Extensibility Component&nbsp;&nbsp;<TD CLASS=cr>16.0.14332.20345&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>{90160000-008C-0000-1000-0000000FF1CE}&nbsp;&nbsp;<TD>Microsoft Corporation&nbsp;&nbsp;<TD CLASS=cr>2023-05-18
<TR><TD><TD><TD>Office 16 Click-to-Run Licensing Component&nbsp;&nbsp;<TD CLASS=cr>16.0.14332.20345&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>{90160000-007E-0000-1000-0000000FF1CE}&nbsp;&nbsp;<TD>Microsoft Corporation&nbsp;&nbsp;<TD CLASS=cr>2023-05-18
<TR><TD><TD><TD>Office 16 Click-to-Run Localization Component [Русский (Россия)]&nbsp;&nbsp;<TD CLASS=cr>16.0.14332.20281&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>{90160000-008C-0419-1000-0000000FF1CE}&nbsp;&nbsp;<TD>Microsoft Corporation&nbsp;&nbsp;<TD CLASS=cr>2023-05-18
<TR><TD><TD><TD>STDU Viewer version 1.6.361.0&nbsp;&nbsp;<TD CLASS=cr>1.6.361.0&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>STDU Viewer_is1&nbsp;&nbsp;<TD>STDUtility&nbsp;&nbsp;<TD CLASS=cr>2023-05-18
<TR><TD><TD><TD>Update for x64-based Windows Systems (KB5001716)&nbsp;&nbsp;<TD CLASS=cr>8.94.0.0&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>{DA80A019-4C3B-4DAA-ACA1-6937D7CAAF9E}&nbsp;&nbsp;<TD>Microsoft Corporation&nbsp;&nbsp;<TD CLASS=cr>2024-10-16
<TR><TD><TD><TD>VixWin Platinum&nbsp;&nbsp;<TD CLASS=cr>3.50.000&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>{81695582-88F8-47A6-8431-C10617AF058A}&nbsp;&nbsp;<TD>Gendex&nbsp;&nbsp;<TD CLASS=cr>2023-05-19
<TR><TD><TD><TD>WinRAR 6.21 (64-разрядная)&nbsp;&nbsp;<TD CLASS=cr>6.21.0&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>WinRAR archiver&nbsp;&nbsp;<TD>win.rar GmbH&nbsp;&nbsp;<TD CLASS=cr>
<TR><TD><TD><TD>КриптоПро CSP&nbsp;&nbsp;<TD CLASS=cr>5.0.12330&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>{50F91F80-D397-437C-B0C8-62128DE3B55E}&nbsp;&nbsp;<TD>Компания КриптоПро&nbsp;&nbsp;<TD CLASS=cr>2023-05-18
<TR><TD><TD><TD>КриптоПро ЭЦП Browser plug-in [Русский (Россия)]&nbsp;&nbsp;<TD CLASS=cr>2.0.14816&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>{E12CC7EE-36B7-4AAA-924E-2F5CD75BCECF}&nbsp;&nbsp;<TD>Компания КриптоПро&nbsp;&nbsp;<TD CLASS=cr>2023-05-18
<TR><TD><TD><TD>Платные услуги К1-1&nbsp;&nbsp;<TD CLASS=cr>0.1&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>{E59C5221-50B3-420C-84C0-DF40A1AC280E}&nbsp;&nbsp;<TD>Maximus&nbsp;&nbsp;<TD CLASS=cr>2023-05-18
<TR><TD><TD><TD>Среда выполнения Microsoft Edge WebView2 Runtime&nbsp;&nbsp;<TD CLASS=cr>131.0.2903.146&nbsp;&nbsp;<TD CLASS=cr>Неизвестно&nbsp;&nbsp;<TD>Microsoft EdgeWebView&nbsp;&nbsp;<TD>Корпорация Майкрософт&nbsp;&nbsp;<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 это с какой строки считать имя колонок, на другом примере его значение может, отличатся, по этому можешь его опустить, а выяснить нужные локации колонок, уже после.
Похожие вопросы