html5lib dart. Запрос по исключению броска селектора класса

0

Я пытаюсь получить элемент с классом nav с помощью селектора .nav. В результате возникает исключение lib throw:

реализованы только селектора типов.

Пример кода:

import 'package:html5lib/parser.dart';

void main() {
  String html = '''
    <html>
    <head><title>Some title</title></head>
    <body>
    <div class="nav">Some nav content</div>
    </body>
    </html>
  ''';
  var doc = parse(html);

  print(doc.query('.nav'));
}

Консольный выход:

Breaking on exception: UnimplementedError: only type selectors are implemented
Unhandled exception:
UnimplementedError: only type selectors are implemented
#0      Node._typeSelector (package:html5lib/dom.dart:269:7)
#1      Node.query (package:html5lib/dom.dart:249:62)
#2      main (/home/hello/dart/test/bin/simple_exp.dart:14:18)
#3      _startIsolate.isolateStartHandler (dart:isolate-patch/isolate_patch.dart:190)
#4      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:93)

Что не так?

Теги:
dart
html5lib

2 ответа

3
Лучший ответ

Полное совпадение селектора CSS еще не реализовано.

В зависимости от вашего варианта использования вы можете сопоставлять тип (имя тега), а затем фильтровать результаты, используя атрибут класса Element.

Вот пример того, как это сделать:

  var el = doc.queryAll('div').where((el) => 
      el.attributes.keys.contains('class') &&
        el.attributes['class'].split(' ').contains('nav')).first;

Надеемся, что кто-то вскоре будет реализовывать поддержку выбора селектора запросов - потому что эта работа очень неэффективна для документов с большим количеством тегов div.

Другое решение - сделать свой собственный обход - что-то вроде этого:

queryClass(Node element, String className) {
  for (var node in element.nodes) {
    if (node is! Element) continue;
    if (node.attributes.keys.contains('class') 
        && node.attributes['class'].split(' ').contains(className)) {
      return node;
    }
    var result = queryClass(node, className);
    if (result != null) return result;
  }
  return null;
}

main() {
   var doc = parse(...);
   var el = queryClass(doc, 'nav');
   print(el);
}
  • 0
    хорошо спасибо :)
  • 0
    Не знаете, будет ли это реализовано?
Показать ещё 1 комментарий
1

Просматривая код анализатора html5lib, вы можете видеть, что функция запроса работает только для селектора типов (например: div, head и т.д.). В исходном коде есть комментарий, в котором указано, что, кроме того, исключенное исключение является довольно явным.

Вероятно, решение для вашего дела было бы использовать метод queryAll для возврата всех div и повторения их до тех пор, пока вы не найдете тот (или тот), который имеет соответствующий класс. Я знаю, что это далеко не идеальное решение, но это может сработать.

Надеюсь, поможет!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню