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