Имя: Пароль:
1C
 
8.3. как найти узел html по селектору?
0 SeiOkami
 
16.01.19
13:40
Добрый день

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

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

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

Так?
19 SeiOkami
 
16.01.19
15:21
(18), да, но это возвращает не ДокументDOM, а ДокументHTML
20 Мыш
 
16.01.19
15:33
(19) Тогда вместо ЧтениеHTML сделай ЧтениеXML
21 SeiOkami
 
16.01.19
15:41
(20), тогда падает ошибка:
Specification mandate value for attribute defer
22 Asmody
 
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.ПолучитьСледующий();
...
23 SeiOkami
 
16.01.19
15:44
(22), о, спасибо

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

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

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

https://www.nalog.ru/rn77/related_activities/registries/reestrkkt/
25 Asmody
 
16.01.19
15:47
(24) Как минимум, там в url-е файлика бэкслеш вместо слеша.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший