html - 如何解析 HTML 文档中的不同元素(在 Dart/Flutter 中)并保持顺序不变
问题描述
- 我有一个大型 HTML 文档,其中依次包含不同类型的重要信息。
- 我在 Dart/Flutter 中解析
- 获取原始信息很好
- 我的问题是,解析不同类型/名称(图像、文本、标题等)的元素将丢失元素在文档中相互显示的顺序。
例如。一个标题,然后是图像,然后是一些文本,然后是另一个图像,然后是一些文本。
我真的需要与此等价的:html.getElementsByTagName('title' or 'p' or 'whatever-else-I-need')。然后我可以在循环中处理并在正确排序的列表中输出我的模型。
解析不同元素标签/数据类型的序列关键信息一定是常见的。非常感激。
解决方案
我不是专家package:html
(也不是一般的 HTML 和 CSS),但我认为您可以使用Document.querySelectorAll
适当的选择器字符串:
import 'package:html/parser.dart' as html;
void main() {
var htmlStr = r'''\
<html>
<head>
<title>My title</title>
</head>
<body>
<p>Lorem ipsum</p>
<img src="foo.png">
</body>
</html>
''';
var document = html.parse(htmlStr);
var elements = document.querySelectorAll('title,p,img');
elements.forEach(print);
// Prints:
// <html title>
// <html p>
// <html img>
}
如果选择器不符合您的要求,您可以编写一个遍历树的函数:
import 'package:html/dom.dart' as dom;
/// Walks [document] and invokes [elementCallback] on each element using a preorder
/// traversal.
///
/// [elementCallback] should return true to continue walking the tree, false to
/// abort.
void walk(dom.Document document, bool Function(dom.Element) elementCallback) {
var stack = <dom.Element>[];
stack.addAll(document.children.reversed);
while (stack.isNotEmpty) {
var element = stack.removeLast();
if (!elementCallback(element)) {
break;
}
stack.addAll(element.children.reversed);
}
}
然后您可以walk
使用适当的回调运行,有条件地将每个回调添加Element
到 some List
,例如:
var elements = <Element>[];
var wantedTags = {'title', 'p', 'img'};
walk(document, (element) {
if (wantedTags.contains(element.localName)) {
elements.add(element);
}
return true;
});
推荐阅读
- css - 使用 var 设置 SVG 渐变中的偏移位置
- angular - 声纳覆盖率:lcov 覆盖率报告中的文件路径不正确
- javascript - 为什么这个脚本不起作用?实时预览中未显示任何内容
- google-admin-sdk - 如何在没有oauth2的g套件中创建新用户
- r - ggsave 和 gganimate 的“动画”中符号的大小一致
- javascript - Symfony 4 - 使用带有 webpack encore 的 Algolia 地方
- nuget - Artifactory 中的 Nuget 异常
- python - 如何检查字符串列表中的字符串是否在熊猫数据框列中
- java - 按顺序对数组进行排序
- javascript - javascript中的函数语法