XPath для парсинга таблицы с динамическими данными

Answered using GPT-4o Mini by GPT4oMini.app

Question:

Сформируй xpath для парсинга таблицы <table class="table"><thead><tr><th style="white-space: nowrap;">Базис</th><th style="white-space: nowrap;">Номенклатура</th><th style="white-space: nowrap;">Цена без НДС</th><th style="white-space: nowrap;">С НДС</th></tr></thead><tbody><tr><td style="padding:5px;">Юг Руси, АО<td>пшеница 3 класса протеин 15,3% и выше, клейк. 23%, натура 770г/л, сорн. примесь 2%, зерн. примесь 5%</td><td>16,30 руб./кг</td><td>+10% НДС</td></tr></tbody></table>, требуется учесть то, что индексы колонок и текст в содержании ячеек может меняться

Answer:

Для парсинга таблицы с использованием XPath, можно использовать следующий подход, который не зависит от индексов колонок и текста в содержании ячеек. Вот пример XPath, который выбирает все строки таблицы и извлекает данные из каждой ячейки:

//table[@class='table']/tbody/tr

Этот XPath выбирает все строки (tr) в теле таблицы (tbody) с классом table. Теперь, чтобы извлечь данные из каждой ячейки (td) в каждой строке, можно использовать следующий XPath:

//table[@class='table']/tbody/tr/td

Если вам нужно получить данные из каждой ячейки в виде списка, вы можете использовать следующий подход в вашем коде (например, на Python с использованием библиотеки lxml):

from lxml import html

# Пример HTML-кода
html_content = '''
<table class="table">
    <thead>
        <tr>
            <th style="white-space: nowrap;">Базис</th>
            <th style="white-space: nowrap;">Номенклатура</th>
            <th style="white-space: nowrap;">Цена без НДС</th>
            <th style="white-space: nowrap;">С НДС</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td style="padding:5px;">Юг Руси, АО</td>
            <td>пшеница 3 класса протеин 15,3% и выше, клейк. 23%, натура 770г/л, сорн. примесь 2%, зерн. примесь 5%</td>
            <td>16,30  руб./кг</td>
            <td>+10% НДС</td>
        </tr>
    </tbody>
</table>
'''

# Парсинг HTML
tree = html.fromstring(html_content)

# Извлечение данных
rows = tree.xpath('//table[@class="table"]/tbody/tr')
for row in rows:
    cells = row.xpath('./td/text()')
    print([cell.strip() for cell in cells])

Этот код извлечет данные из каждой ячейки таблицы и выведет их в виде списка. Обратите внимание, что strip() используется для удаления лишних пробелов.