Два условия XPATH

Поддержка
  • Подскажите пожалуйста а то я чувствую буду ответ искать еще пару недель.
    Есть код сайта типа

    <div class="chat-online-users">
    <a href="#" onclick="chatWithMe(this); return false;" data-id="31783182" data-age="40" data-username="chitchat" data-city="Bács-Kiskun" data-country="Hungary" data-sexe="male" data-favorite="" class="topadclick list-group-item homme">
    <table style="width: 100%;">
    <tbody><tr>
    </tbody></table>
    </a>
    <a href="#" onclick="chatWithMe(this); return false;" data-id="32829557" data-age="27" data-username="Batman_5" data-city="Chandigarh" data-country="India" data-sexe="male" data-favorite="" class="topadclick list-group-item homme">
    <table style="width: 100%;">
    <tbody><tr>
    

    Достаю от туда через XPATH все айдишники так

    //*[contains(@class,'chat-online-users')]/a/@data-id
    

    Но мне нужны не все, а исключить те айдишники где data-country="India"

    Типо так

    and not(contains(@data-country, 'India')
    

    Пытался встроить по другим примерам, но так и не понял как правильно можно объединить эти условия

  • @stell1 Вы уже все составили, у вас ошибка техническая

    //*[contains(@class,'chat-online-users') ]/a[@data-id and not(contains(@data-country, 'India'))]
    

    у вас 1 скобки не хватало

  • @lotra Да у меня там и квадратных не было я пытался их в первых объединить, потому что до этого видел другой пример вообще без квадратных скобок и еще больше запутался. Спасибо большое за помощь

  • @stell1 Не за что, экспериментируйте, не бойтесь) когда просто ключ без пары значение как у меня в примере вот этот @data-id это просто проверка на наличие, он не смотрит что внутри он ищет этот ключ. квадратные скобки это внутри switch грубо говоря вы указываете ему что искать тут. селектор как у вас говорил ему что нужно найти contains(@class,'chat-online-users') и искать нужно значение вот этого @data-id вы акцентировали на нем выражение.
    как пример вот как он вытащил бы все из /а //*[contains(@class,'chat-online-users')]/a[@data-id]
    в квадратных скобках можно обращаться к одному и тому же ключу сколько угодно раз например есть и содержит это и не содержит это и так далее, можно очень хитрые селекторы составлять главное понять как оно работает)

  • @lotra А не подскажите еще почему BAS не может вывести список. Вот по моему коду находится список id допустим 2000, по вашему находится 1500. Т.е в начале я когда тестил всё правильно было он исключал ненужные страны. Но сейчас когда дошёл до реалезации заметил что в самой переменной списка он просто добавляет пустые строки
    Список
    Судя по тому что само кол-во строк правильное, ошибка в каком-то селекторе и он весь /a пытается отобразить а не только data-id

  • @stell1 said in Два условия XPATH:

    Судя по тому что само кол-во строк правильное, ошибка в каком-то селекторе и он весь /a пытается отобразить а не только data-id

    Прикладывайте код всей страницы или ссылку на страницу, смысл гадать?

  • @stell1 раз он собирает их значит они подходят под ваше выражение, задайте еще условий или как написал выше @Fox покажите ее. Раз он собирает значит оно подходит это все что можно сказать

  • @Fox
    Это и есть код всей страницы точней той части из которой я вытягиваю значения кидал в шапке темы.

    <div class="chat-online-users">
    <a href="#" onclick="chatWithMe(this); return false;" data-id="31783182" data-age="40" data-username="chitchat" data-city="Bács-Kiskun" data-country="Hungary" data-sexe="male" data-favorite="" class="topadclick list-group-item homme">
    <table style="width: 100%;">
    <tbody><tr>
    </tbody></table>
    </a>
    <a href="#" onclick="chatWithMe(this); return false;" data-id="32829557" data-age="27" data-username="Batman_5" data-city="Chandigarh" data-country="India" data-sexe="male" data-favorite="" class="topadclick list-group-item homme">
    <table style="width: 100%;">
    <tbody><tr>
    

    Дальше там всё дублируется ничего нового нет поэтому не видел смысла кидать больше


    Вот сделал тестовый скрипт с этой ошибкой в нём уже весь кусок страницы засунул в переменную. xpath.xml Как видите в первом варианте он нашёл из этого кода айдишники, а во втором судя по тому что их стало меньше он тоже нашёл правильно и исключил Индийские, но только он не вывел это а пустые строки добавил
    alt text

  • @stell1 said in Два условия XPATH:

    Дальше там всё дублируется ничего нового нет поэтому не видел смысла кидать больше

    Вы применяете xpath только к этому куску кода или ко всей странице?

  • @Fox Только к этому на самом сайте блок с юзерами отдельно как бы идёт. И я Действием "Получить код элемента" беру SAVED_XML

  • @stell1 said in Два условия XPATH:

    @Fox Только к этому на самом сайте блок с юзерами отдельно как бы идёт. И я Действием "Получить код элемента" беру SAVED_XML

    Непонятно зачем вам логическое "И" в выражении? Достаточно использовать функцию not().
    Можете использовать вот такой xpath:

    //*[contains(@class,'chat-online-users') ]/a[not(contains(@data-country, 'India'))]/@data-id
    

    85a71c16-0abc-4160-aab8-7416e1204a6d-изображение.png

    xpath 2.xml

  • @Fox Но я изначально и спрашивал как составить, потому что вообще ноль в xpath, просто в каком-то примере тут на форуме видел что пишут and not так и скопировал. Спасибо в любом случае за помощь

  • @Fox @data-id по этому, в первом вопросе этот ключ был.

  • @stell1 А вы не списком их получаете?

  • @lotra Юзеров на сайте? Нет, получаю вот код элемента, а дальше уже через Xpath вытягиваю нужные значения в список. Я раньше с помощью регулярок это всё делал сам, но говорят что через xpath быстрее и меньше потоки грузит

  • @stell1 Вы можете сначала их получить как количество. а потом по списку в цикле собрать,
    Есть экшен который получает количество элементов по текущему запросу xpath получаете сколько и в цикле берете их пример
    xpath на количество стандартный //*[contains(@class,'chat-online-users') ]/a[@data-id and not(contains(@data-country, 'India'))] Или какой у вас там теперь.
    затем в цикле вы знаете сколько их из переменной CYCLE_INDEX она автоматически появляется составляете выражение и подставляете его для получения вот так если выражение тоже
    "//*[contains(@class,'chat-online-users') ]/a[" +(CYCLE_INDEX +1) + "][@data-id and not(contains(@data-country, 'India'))]"
    Это если ваш цикл начинается от 0 если от единицы как по умолчанию в басе "//*[contains(@class,'chat-online-users') ]/a[" +(CYCLE_INDEX) + "][@data-id and not(contains(@data-country, 'India'))]"
    объявляете это выражение как переменную и в экшене пишете не выражение а переменную оборачивая ее в [[]] Бас понимает переменные в этих экшенах. Если это в браузере а не в кубике xpath то не забывайте подставить впереди ">XPATH> "
    каждый xpath-xml будет 1 строкой с 1 значением по запросу ее проверяете на валидность и уже если нужно вставляете в ваш список

  • @lotra said in Два условия XPATH:

    @Fox @data-id по этому, в первом вопросе этот ключ был.

    чегось?

  • @Fox

    @Fox said in Два условия XPATH:

    Непонятно зачем вам логическое "И" в выражении? Достаточно использовать функцию not().
    Можете использовать вот такой xpath:

    @stell1 said in Два условия XPATH:

    Достаю от туда через XPATH все айдишники так

    //*[contains(@class,'chat-online-users')]/a/@data-id
    

    Но мне нужны не все, а исключить те айдишники где data-country="India"

    Типо так

    and not(contains(@data-country, 'India')
    

    Пытался встроить по другим примерам, но так и не понял как правильно можно объединить эти условия

    Я и объединил их как в вопросе. поэтому там and()

  • @lotra said in Два условия XPATH:

    Я и объединил их как в вопросе. поэтому там and()

    Ммм, понятно. Смотрите, действия "Xpath получить текст" и "Xpath получить каждый текст" просто выполняют функцию text() для элемента. В разметке пользователя у целевого элемента текста нет (только перенос строки из текста разметки), по этому и действие "Xpath получить каждый текст" возвращало пустые значения. Нужно либо использовать действие "Xpath получить каждый xml" для получения всего кода элемента, либо уточнить целевой атрибут в запросе:

    //*[contains(@class,'chat-online-users') ]/a[@data-id and not(contains(@data-country, 'India'))]/@data-id