Python соскоб - синтаксис XPath с несколькими условиями - PullRequest
1 голос
/ 28 марта 2020

Я пишу простой скребок для получения цен на авиабилеты из Kayak - я собираю несколько элементов данных (продолжительность, авиакомпания, цена и т. Д. c), используя XPath, и сохраняю каждый в списке из 15 значений (# результатов на Страница каяка).

Моя проблема в том, что переменная скребка «цена» возвращает более 15 значений, потому что в дополнение к «лучшему» результату она также извлекает дополнительные отображаемые результаты (см. Скриншот - большой шрифт на RHS и v. . Два предложения в нижнем LHS).

Я сузил проблему до следующего:

1) Общий (рабочий) XPath для получения обоих значений:

'//a[@class="booking-link "]/span[@class="price option-text"]/span[@class = "price-text"]'

2) Ключ к отличию guish основной цены от дополнительной цены лежит в строке @id, где @id для обоих типов цен:

  • (i ) частично сгенерировано случайным образом,
  • (ii) содержит «-price-text» в обоих случаях, а
  • (iii) содержит «дополнительную информацию» только в дополнительной цене,

    например:

    • Основная цена: // * [@ id = "pck6-mb -aE-1d84916e1b2-цена-текст "]
    • Дополнительная цена: // * [@ id =" NB5A-extra-info-hmb-tE-15ae5bd2e33-цена-текст "]

Как мне написать XPath, который извлекает только основные цены, т.е. отфильтровывает любые XPath, которые содержат строку "extra-info" в @id? Я пробовал несколько способов (примеры ниже), но не могу понять, синтаксис правильный. Любая помощь приветствуется, спасибо!

Примеры опробованы:

'//a[@class="booking-link "]/span[@class="price option-text"]/span[@class = "price-text" and not[contains(@id,"extra-info")]]'

'//a[@class="booking-link "]//span[@class="price option-text"]//span[[not[contains(@id,"extra-info")]//span[contains(@id,"-price-text")]]'

'//a[@class="booking-link "]/span[@class="price option-text"]/span[len(@id==33)]' 

введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Попробуйте что-то вроде:

//a[@class="booking-link "]/span[@class="price option-text"]/span[@class="price-text"][not(contains(@id,"extra-info"))]
0 голосов
/ 28 марта 2020

Вы также можете использовать предок, чтобы получить список цен, попробуйте ниже решение

//span[@class='custom-text'][contains(text(),'View Deal')]/ancestor::div[@class="multibook-dropdown"]//span[@class = "price-text"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...