@Fox Спасибо!
Два условия 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 Не за что, экспериментируйте, не бойтесь) когда просто ключ без пары значение как у меня в примере вот этот @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
Прикладывайте код всей страницы или ссылку на страницу, смысл гадать?
-
@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 Как видите в первом варианте он нашёл из этого кода айдишники, а во втором судя по тому что их стало меньше он тоже нашёл правильно и исключил Индийские, но только он не вывел это а пустые строки добавил

-
@stell1 said in Два условия XPATH:
Дальше там всё дублируется ничего нового нет поэтому не видел смысла кидать больше
Вы применяете xpath только к этому куску кода или ко всей странице?
-
@stell1 said in Два условия XPATH:
@Fox Только к этому на самом сайте блок с юзерами отдельно как бы идёт. И я Действием "Получить код элемента" беру SAVED_XML
Непонятно зачем вам логическое "И" в выражении? Достаточно использовать функцию not().
Можете использовать вот такой xpath://*[contains(@class,'chat-online-users') ]/a[not(contains(@data-country, 'India'))]/@data-id
-
@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 значением по запросу ее проверяете на валидность и уже если нужно вставляете в ваш список -
-
@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