Можно ли найти селектор XPath для нескольких сценариев?

#xml #xpath #web-scraping #scrapy

#xml #xpath #очистка веб-страниц #scrapy

Вопрос:

Контекст

Я пытаюсь получить выбор Xpath, который может соответствовать двум сценариям. Мой поисковый робот посещает несколько страниц и ищет конкретную таблицу с помощью селектора Xpath. Затем сканер анализирует таблицу и предназначен для адаптации к первому сценарию, который является наиболее распространенным.

Но в некоторых случаях данные представлены по-разному, как вы можете видеть во втором сценарии.

Первый сценарий

 <tr>
    <th>node_1</th>
    <td>
        <div class="plainlist">
            <ul>
                <li><a href=#>item_1</a></li>
                <li><a href=#>item_2</a></li>
                <li>item_3</li>
            </ul>
        </div>
    </td>
</tr>
 

Выбор Xpath хорошо работает с этим:

table.xpath('//tr/th[contains(text(),"node_1")]/following-sibling::td//text()[normalize-space()]').getall()

2-й сценарий

 <tr>
    <th>
        <div>Node<br>name</div>         #subnode   formatting
    </th>
    <td>
        <div>
            <div class="plainlist">
                <ul>
                    <li><a href="#">item_1</a></li>
                    <li><a href="#">item_2</a></li>
                </ul>
            </div>
        </div>
    </td>
</tr>
 

Проблема

Существует ли селектор Xpath, который может использовать оба сценария, или мне нужно попробовать первый селектор и написать другой, если результатов нет?

Ответ №1:

Вы можете использовать загрузчики элементов и output_processor = TakeFirst() для элемента:

 l.add_xpath('FieldName', '//your/first/xpath')
l.add_xpath('FieldName', '//your/second/xpath')