Страницы: 1
RSS
Как спрасить страницу с сайта если Power Query не может данные на странице, выбрать данные с сайта по требуемым полям
 
Добрый день, Уважаемые Участники форума!!!
Столкнулся с проблемой загрузки данных с сайта https://vetrf.ru/license/publicui?_action=listLicenses&orderBy=declarant&order=ASC
При загрузке источника данных через интернет с указанием ссылки выше, Power Query  не отображает данные, которые хотел бы получить. А именно данные по организациям с указанием всех доступных полей. Пример  запроса прилагаю и картинки для понимания того, что хочу забрать с сайта. Как я понимаю Power Query может работать с таблицами, а если данные не представлены в виде таблицы на сайте, то эти данные как -то можно забрать? Спасибо!

картинки удалены - превышение допустимого размера вложения [МОДЕРАТОР]
Изменено: zaga - 25.07.2019 15:09:21
 
А нЕ проще сделать на сайте "Печать реестра" сразу получаете таблицу всех ЮЛ/ИП, копируйте-вставляйте.
 
В виде HTML-кода нужный вам кусок, в принципе не сложно по ссылке выцепить:
Код
let
    Источник = Web.BrowserContents("https://vetrf.ru/license/publicui?_action=listLicenses&orderBy=declarant&order=ASC", [WaitFor=[Timeout=#duration(0, 0, 0, 2)]]),
    Пользовательская1 = Text.BetweenDelimiters( Источник, "</ul>", " <ul class=")
in
    Пользовательская1

но дальше нужно парсить уже его, удалять код, выцеплять нужные вам наименования и приводить к табличному виду.
Даю наводку: для начала нужно придумать как из текста удалить все куски заключенные между символами "<" и ">".
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
но дальше нужно парсить уже его,
Привет, Алексей.
В Power BI это несколько проще - там в Power Query можно использовать такую вот штуку Power BI / Power Query (Using CSS Selectors). Некоторые вещи можно делать много проще, чем в Power Query для Excel.
 
Андрей VG, тыкался я в эту кнопку, как и ТС (судя по названиям шагов в примере) но т.к. в ХТМЛкоде этот список органзиций не размечен как таблица то этот инструмент его не находит. Поэтому предложил вот так. Я конечно, особо не погружался в эту тему, может можно и так. Я даже пробовал залезть в ссылку Печать реестра, где формируется шикарная таблица из всех организаций сразу, но в коде страницы этой таблицы тоже не видно, т.к. она формируется судя по всему каким-то запросом и чтобы её получить надо уже погружаться в методы GET, а это значит разбираться с API это тоже на долго.
Вот горшок пустой, он предмет простой...
 
Доброго времени суток
Код
let
    RegRepl  = (s,p,r)=> Web.Page("<script>document.write('"&s&"'.replace(/"&p&"/g,'"&r&"'));</script>"){0}[Data]{0}[Children]{1}[Children]{0}[Text],
    Source   = Web.BrowserContents("https://vetrf.ru/license/publicui?_action=listLicenses&orderBy=declarant&order=ASC"),
    Prepare  = List.Accumulate({{"#(cr,lf)",""},{"#(lf)",""},{"'","&apos;"},{"""","&quot;"},{"<","&lt;"}},Source,(a,b)=>Text.Replace(a,b{0},b{1})),
    Replace  = RegRepl(Prepare,"&lt;span style=&quot;font-weight: bold;&quot;>(.*?)(?:&lt;\/span>)\s*(.*?)(?=\s*\&lt;)","&lt;div id=\'$1\'>$2&lt;/div>"),
    Fields   = List.Distinct(Html.Table(Source,{{"Fields","span"}},[RowSelector=".article span"])[Fields]),
    Result   = Html.Table(Replace,List.Transform(Fields,each {_,"div[id='"&_&"']"}),[RowSelector=".article"])
in
    Result
 
Цитата
Андрей_26 написал:
А ни проще сделать на сайте "Печать реестра" сразу получаете таблицу всех ЮЛ/ИП, копируйте-вставляйте.
Добрый день, Андрей_26, я знаю что можно сделать печать реестра и скопировать и вставить. Но от этого не будет автоматического обновления данных.

Андрей Лящук, СУПЕР!!!!! Спасибо это как раз то, что нужно для решения данной задачи. Теперь попробую добавить остальные страницы реестра с 1 по Всего : 17294,
При открытии запроса 1 вышла ошибка. выкладываю скрин.

Андрей VG, с Power BI / Power Query (Using CSS Selectors). пробовал тоже делать до написания на форум, через Добавить страницы используя примеры.
Однако выходит ошибка не найдено селекторов для обозначений CSS...
 
Андрей Лящук на шаге  источник поменял ссылку на веб https://vetrf.ru/license/publicui?_action=listLicenses&orderBy=declarant&order=DESC
сделал сортировку по заявителю и ошибка исчезла...
 
Андрей Лящук, спасибо! Столько всего вкусного, и регулярки и css. Долго такое разбирать придется.
Вот горшок пустой, он предмет простой...
 
PooHkrd, ну по поводу regex я погорячился, можно, может даже нужно,  без него.
упростил запрос, завернул в функцию для сбора с диапазона страниц
Код
let
    Collect=(url,fromPage,optional toPage as nullable number)=> let
        Source   = Web.BrowserContents(url &Text.From(fromPage)),
        toPage   = if toPage=null then Number.RoundUp(Number.From(Text.BetweenDelimiters(Source,"Всего : <b>","</b>."))/10) else toPage,
        Extract  = Text.BetweenDelimiters(Source, "</ul>", " <ul class="),
        Replace  = Text.Trim(List.Accumulate({{"#(cr,lf)",""},{"#(lf)",""},{"<span style=""font-weight: bold;"">","</div><div id='"},{"</span>","'>"},{"</p>","</div>"}},Extract,(a,b)=>Text.Replace(a,b{0},b{1}))),
        Fields   = List.Distinct(Html.Table(Extract,{{"Fields","span"}},[RowSelector=".article span"])[Fields]),
        Result   = Html.Table(Replace,List.Transform(Fields,each {_,"div[id='"&_&"']"}),[RowSelector=".article"])
    in if fromPage<toPage then Table.Combine({Result,@Collect(url,fromPage+1,toPage)}) else Result,
    Source = Collect("https://vetrf.ru/license/publicui?_action=listLicenses&orderBy=declarant&order=ASC&page=",1,10)
in
    Source

и вариант с POST
Код
let
    Query  = "id=declarant&id=declarantType&id=category&id=activityPlace&id=place&id=organizationalForm&id=licensingAgency&id=licenseNum&id=periodOfValidity&id=inn&id=ogrn&id=decisionDate&id=deliveryDate&id=addInformationTermination",
    Source = Web.Page(Text.FromBinary(Web.Contents("https://vetrf.ru/license/publicui?_action=printLicenses", [Headers=[#"Content-Type"="application/x-www-form-urlencoded"],Content = Text.ToBinary(Query)]))){[Source="Table"]}[Data]
in
    Source
 
zaga, размер вложения - не более 300 кБ. Хотите показать - уменьшайте размер своих художеств
 
Цитата
Андрей Лящук написал:
и вариант с POST
А можно по подробнее про строку в переменной Query, откуда вы её взяли? Это где-то в коде страницы подсмотрели?
Вот горшок пустой, он предмет простой...
 
ага, тут  подсмотрел, потом в консоли выполнил
Код
$('input[name="id"]').map((a,b)=>'id='+b.value).toArray().reduce((a,b)=>a+"&"+b)
 
Андрей Лящук, чем дальше в лес, тем толще партизаны!  :D
Это на каком языке? И какой мануал курить чтобы понимать что за код писать в консоли, чтобы получить строку для POST?
И, кстати, можно ли этот код закинуть к сайту прямо в запросе, чтобы получать строку в запросе?
Вот горшок пустой, он предмет простой...
 
Андрей Лящук, СПАСИБО ОГРОМНОЕ!!!! вариант с POST работает прекрасно, и обновление происходит быстро. На выходе получается полный список всех заявителей!!!!
 
Цитата
PooHkrd написал:
Это на каком языке?
Javascript и немного jQuery :)
Там на странице находится html форма <form></form>, внутри элементы <input />, именно их значения и шлются, вообще повезло, что заработало именно в таком исполнении, ибо только разрабу известно, чем и во что эти значения заворачиваются перед отправкой и как потом читаются
В данном случае можно так собрать строку запроса
Код
    fn=(s,optional i as nullable number,optional s1 as nullable text)=> let
        i = if i = null then 1 else i,
        id = Text.BetweenDelimiters(Source,"<input name=""id"" value=""",""" type=""checkbox"">",i),
        s1 = if s1 = null then "id="&id else s1&",id="&id
    in if id="" then Text.Start(s1,Text.Length(s1)-4) else @fn(s,i+1,s1),
    Query=fn(Web.BrowserContents("https://vetrf.ru/license/publicui?_action=licenseListPrintSetup"))
Изменено: Андрей Лящук - 25.07.2019 17:31:55
 
Андрей Лящук, во, стало гораздо понятнее (тему в закладки), но в таком случае в Экселе эту штуку (Web.BrowserContents) не запустишь, только в PBI.
Огромное спасибо.
З.Ы. Поковырялся тут, оказывается можно и в Экселе запустить: Web.BrowserContents = Text.FromBinary(Web.Contents())
осталось всего ничего разобраться с JS и jQ  :D Есть куда расти.
Изменено: PooHkrd - 25.07.2019 18:15:12
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
оказывается можно и в Экселе запустить: Web.BrowserContents
Привет, Алексей.
Вот такой штуки Html.Table в Excel, увы, нет.
 
Андрей VG, так вроде и не надо. Андрей в своём варианте с POST запросом эту функцию не пользует. Там сайт на выходе даёт готовую таблицу, которую не нужно из css выуживать.
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх