html5lib dart. Запрос по исключению броска селектора класса
Я пытаюсь получить элемент с классом 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)
Что случилось?
2 ответа
Полное соответствие селектора CSS еще не было реализовано.
В зависимости от вашего варианта использования вы можете найти соответствие по типу (имени тега), а затем отфильтровать результаты, используя атрибут класса элемента.
Вот пример того, как это сделать:
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);
}
Просматривая код синтаксического анализатора html5lib, вы видите, что функция запроса работает только для селектора типа (например, div, head и т. Д.). В исходном коде есть комментарий, в котором говорится, что выброшенное исключение является довольно явным.
Вероятно, решением для вашего случая будет использование метода queryAll для возврата всех элементов div и их перебора, пока вы не найдете тот (или те), которые имеют соответствующий класс. Я знаю, что это далеко не идеальное решение, но оно может сработать.
Надеюсь, поможет!