Функция Xpath для удаления пробелов (normalize-space())



  •  <span class="views icon-eye">296</span>
                        </span>
                </div>
                
                <div class="ad-meta-data">
                    <h1 class="title">
                        Bitmain asic antminer s9 13. 5 th/s (в наличии)                </h1>
    
                    <div class="info">
                        <span class="date">
                            Вчера, 23:41                    </span>
                    </div>
                    <p class="description">
                        Bitmain asic antminer s9 13. 5 th/s (в наличии)                </p>
    
                    
                        <a href="/user/1935415">
    

    Здравствуйте.
    Из исходного кода страницы нужно вытащить, Title и Description.

    Действия:
    Экшин Xpath получить xml с запросом

    //p[@class='description']/text()
    

    Descripton получаю с лишними пробелами и переносами строк

    "
                        Bitmain asic antminer s9 13. 5 th/s (в наличии)                "
    

    В сети узнал что есть встроенная функция normalize-space(), но не пойму как ее прописать в Xpath запрос



  • @solt Она вроде убирает пробелы только у значений параметров атрибутов. Так что удаляй их уже после получения. Кстати там есть получить текст xml тогда не нужная функция text() можно просто //p[@class='description']



  • This post is deleted!


  • @Denis_krsk said in Функция Xpath для удаления пробелов (normalize-space()):

    Она вроде убирает пробелы только у значений параметров атрибутов

    Вроде нет http://xpoint.ru/know-how/XML/XSLT/CookBook/Trim .

    Из этого примера не как не пойму, где ее использовать в запросе

    //p[@class='description']/text()
    


  • @solt Тоже сталкивался с подобной задачей. Покопался немного, не решил через Xpath, зато решил своими любимыми регулярками :D.

    Попробуйте через trim:

    [[TEST]] = [[XPATH_TEXT]].trim()
    

    Вот пример.



  • @solt Кстати свою же задачу полугодовалой давности сейчас решил:
    @Fox said in Xpath замена параметров в конфиге proxifier:

    @UA Решил я значит перейти с любимых мной регулярок на Xpath.
    На сайте в дереве dom-элементов текст с переносом строки:

    " Fox
    										
    											"
    

    Если применять экшен Xpath получить текст, то получаешь пробел. Сработал Xpath получить xml

    //div[@class="nickname"]/text()[2]
    

    В логе получается идеально, но вот сохраняя в файл вижу:

     Fox&#13;
    										&#13;											
    

    И вот с этим мифическим элементом переноса строки &#13; ни как не получается справиться..
    trim() не помогает.

    Вернул регулярку в место Xpath, пока не придумаю как решить.

    Оказалось replace легко справляется с &#13

    [[XPATH_XML]] = ([[XPATH_XML]]).replace(/&#13;/g, "")
    [[TEST]] = [[XPATH_XML]].trim()
    

    Может и вам поможет.



  • @Fox said in Функция Xpath для удаления пробелов (normalize-space()):

    Попробуйте через trim:

    @Fox said in Функция Xpath для удаления пробелов (normalize-space()):

    Оказалось replace легко справляется с &#13

    Спасибо. Хороший вариант. Воспользуюсь вашим способом.

    Вопрос останется открытым, т.к. хотелось бы "Убить двух зайцев" одним запросом, что бы минимизировать количество действий/запросов в скрипте.



  • @solt @Fox Я раньше подобные задачи тут http://videlibri.sourceforge.net/cgi-bin/xidelcgi пробовал решать, но уже несколько дней не работает, а аналогичные сервисы все какие-то не какие :( Там было удобно тестить ввел запрос, а тебе сразу результат. Может кстати кто-то подскажет достойную замену сервису?



  • Что то наколдовал (сам пока не пойму что :) ) В код полез в первые, до этого в BAS пользовался только готовыми действиями ("Кубиками")

    Если что, поправите (можно так\нельзя\в чем ошибка?)... Пока работает :)

    Решил не использовать действие Xpath получить текст для каждого запроса отдельно. А записать все в одно действие "Выполнить код"

    VAR_DESCRIPTION = http_client_xpath_xml("//p[@class='description']/text()",!(true))
    VAR_DESCRIPTION = VAR_DESCRIPTION.trim()
    VAR_TITLE = http_client_xpath_xml("//h1/text()",!(true))
    VAR_TITLE = VAR_TITLE.trim()
    VAR_NAME = http_client_xpath_xml("//div[@class='owner-name ']/text()",!(true))
    VAR_NAME = VAR_NAME.trim()
    VAR_DATE = http_client_xpath_xml("//span[@class='date']/text()",!(true))
    VAR_DATE = VAR_DATE.trim()
    VAR_PRICE = http_client_xpath_xml("//span[@class='price float-left']/text()",!(true))
    VAR_PRICE = VAR_PRICE.trim()
    VAR_PHONE = http_client_xpath_xml("//a[@id='phoneCall']/@href",!(true))
    VAR_PHONE = VAR_PHONE.trim()
    VAR_PHONE = VAR_PHONE.replace("tel:", "")
    VAR_VIEWS = http_client_xpath_xml("//span[@class='views icon-eye']/text()",!(true))
    VAR_VIEWS = VAR_VIEWS.trim()
    

    https://i.imgur.com/Tp20WlB.jpg



  • @solt said in Функция Xpath для удаления пробелов (normalize-space()):

    normalize-space()

    Я взялся потестировать эту тему, причем интересовал именно подход с

    normalize-space()
    

    Так вот. Ничего работать не будет. Потому что уже вот так должно работать:

    normalize-space(//p[@class='description'])
    

    Вот ссылка с онлайн-тестером: https://www.freeformatter.com/xpath-tester.html

    Вот ваш фрагмент:

     <div class="ad-meta-data">
                    <h1 class="title">
                        Bitmain asic antminer s9 13. 5 th/s (в наличии)                </h1>
    
                    <div class="info">
                        <span class="date">
                            Вчера, 23:41                    </span>
                    </div>
                    <p class="description">
                        Bitmain asic antminer s9 13. 5 th/s (в наличии)                </p>
    
                    
                        <a href="/user/1935415">asdfgsdfg</a>
    </div>
    

    Должно работать. А БАС этот квери не может отресолвить. Функция появилась еще в спецификации 1.0. И так же замечательная функция

    translate()
    

    не будет работать.

    Потому что иcпользуется какой-то HTML-парсер, а не XML. Я об этом уже репортил тут: http://community.bablosoft.com/topic/3584/мелочи-от-зануды/35



  • Тоже долго искал пытался удалить эти пробелы потом решил регуляркой удалить по 2 пробела которые рядом есть и в результате получилось так чтоб все нужные пробелы остались а не нужные ушли спасибо @Fox как всегда выручаешь следующий раз попробую твой вариант



  • @solt said in Функция Xpath для удаления пробелов (normalize-space()):

    /text()

    Есть решение для Xpath сейчас рабочее? Я так понял (normalize-space()) уже не фурычит


Log in to reply