Вход | Регистрация
 

8.3. как найти узел html по селектору?

8.3. как найти узел html по селектору?
Я
   SeiOkami
 
16.01.19 - 13:40
Добрый день

Можно ли методом платформы найти в имеющимся документе HTML узел по селектору?

Вижу поиск по ID и по тэгу
 
 
   SeiOkami
 
1 - 16.01.19 - 13:46
Есть ещё ВыражениеXPath, но оно только для DOM (
   SeiOkami
 
2 - 16.01.19 - 13:49
Может как-то можно создать COM объект с полноценным JS?
   Юрий Лазаренко
 
3 - 16.01.19 - 14:20
Элементы.ТвоеПолеHTMLДокумента.Документ.querySelector("input") вернет ссылку на первый input. В параметрах селектора можно указать запрос, который вернет то что надо.
   SeiOkami
 
4 - 16.01.19 - 14:21
(3), это если на форме. Мне нужно в общем серверном модуле получить
   Юрий Лазаренко
 
5 - 16.01.19 - 14:27
(4) А использовать DOM нельзя вместо ДокументHTML?
   SeiOkami
 
6 - 16.01.19 - 14:28
(5), как например?
ПостроительDOM возвращает объект ДокументHTML.
У него не нашёл поиск по селектору.

Я бы мог XPath использовать (даже лучше было бы), но он только в ДокументDOM
   Юрий Лазаренко
 
7 - 16.01.19 - 14:34
(6) Документ создается с нуля? Или есть исходный HTML?
   SeiOkami
 
8 - 16.01.19 - 14:38
Документ качаем с сайта.
   SeiOkami
 
9 - 16.01.19 - 14:39
ТекстовыйДокумент    = Новый ТекстовыйДокумент;
    ТекстовыйДокумент.Прочитать(ПолноеИмяФайла);
    
    
    ДокументHTML = Новый COMОбъект("HtmlFile");
    ДокументHTML.open("text/html");
    ДокументHTML.write(ТекстовыйДокумент.ПолучитьТекст());
    ДокументHTML.querySelector(СтрокаВыражения);
    
    РезультатВыражения    = ДокументHTML.querySelector(СтрокаВыражения).href;
   SeiOkami
 
10 - 16.01.19 - 14:39
Пока что нашёл такой способ. Надеюсь будет работать без нюансов)
 
 Рекламное место пустует
   SeiOkami
 
11 - 16.01.19 - 14:39
Это не метод платформы, но деваться некуда
   Asmody
 
12 - 16.01.19 - 14:42
(10) С нюансами. На linux работать не будет.
   Asmody
 
13 - 16.01.19 - 14:44
(6) Из ДокументHTML можно сделать ДокументDOM через ЗаписьXML/ЧтениеXML. При условии, что html валидный.
   Юрий Лазаренко
 
14 - 16.01.19 - 14:47
(13) Можно сразу читать в ДокументDOM
   Asmody
 
15 - 16.01.19 - 14:51
(14) Можно. Но у меня вылезали какие-то траблы как раз из-за невалидности html. Приходилось объезжать.
   SeiOkami
 
16 - 16.01.19 - 15:05
(14), а как сразу читать в ДокументDOM ?
   SeiOkami
 
17 - 16.01.19 - 15:07
(13), можно пример, не совсем понимаю
   Мыш
 
18 - 16.01.19 - 15:15
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.ОткрытьФайл("index.html");
ПостроительDOM = Новый ПостроительDOM;
ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);

Так?
   SeiOkami
 
19 - 16.01.19 - 15:21
(18), да, но это возвращает не ДокументDOM, а ДокументHTML
   Мыш
 
20 - 16.01.19 - 15:33
(19) Тогда вместо ЧтениеHTML сделай ЧтениеXML
   SeiOkami
 
21 - 16.01.19 - 15:41
(20), тогда падает ошибка:
Specification mandate value for attribute defer
   Asmody
 
22 - 16.01.19 - 15:42
Вот так у меня сделано:

    ЧтениеHTML = Новый ЧтениеHTML;
    ЧтениеHTML.ОткрытьФайл(ИмяФайла, "UTF-8");
    ПостроительDOM = Новый ПостроительDOM;
    ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку("UTF-8");
    ЗаписьDOM = Новый ЗаписьDOM;
    ЗаписьDOM.Записать(ДокументHTML.Тело, ЗаписьXML);
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ЗаписьXML.Закрыть());
    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
    Разименовыватель = Новый РазыменовательПространствИменDOM(ДокументDOM);
    ВыражениеXPath = СтрШаблон("//tr/td[@class=""%1""]/../td[@class=""%1""] | //tr/td[@class=""%1""]/../td[@class=""%2""]", КлассНомера, КлассСуммы);

    РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ВыражениеXPath, ДокументDOM, Разименовыватель);
    
    ЭлементDOM = РезультатXPath.ПолучитьСледующий();
...
   SeiOkami
 
23 - 16.01.19 - 15:44
(22), о, спасибо

Но, походу, HTML не соответсвует XHTML

Падает с ошибкой:

{ВнешняяОбработка.ТестированиеВыраженийHTML.Форма.Форма.Форма(30)}: Ошибка при вызове метода контекста (Записать)
    ЗаписьDOM.Записать(ДокументHTML.Тело, ЗаписьXML);
по причине:
Недопустимое имя XML
   SeiOkami
 
24 - 16.01.19 - 15:44
Вообще, речь о странице с реестром моделей ККТ на сайте ФНС

https://www.nalog.ru/rn77/related_activities/registries/reestrkkt/
   Asmody
 
25 - 16.01.19 - 15:47
(24) Как минимум, там в url-е файлика бэкслеш вместо слеша.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует