如何使用 Kuchiki 获取 HTML 文档的所有文本(script/style/noscript 标签除外)?
How to get all text of a HTML document (except script/style/noscript tags) using Kuchiki?
我正在尝试获取 HTML 页面上的所有文本,不可见文本除外(例如:我不希望 script/style/noscript 标签内的文本)。
这是我到目前为止的想法:
let parser = kuchiki::parse_html().one(content);
for child in parser.inclusive_descendants() {
if let Some(el) = child.as_element() {
let tag_name = &el.name.local;
if tag_name == "script" || tag_name == "style" || tag_name == "noscript" {
child.detach();
}
}
}
let text = parser.text_contents();
println!("{}", text);
想法是第 1 遍将删除任何 script
、style
或 noscript
标签。然后我可以调用 text_contents
来获取可见文本。
但是,text_contents
似乎仍在返回内联 Javascript。
我是不是理解错了 Kuchiki/html5ever API?
inclusive_descendants()
迭代器似乎不喜欢迭代节点 和 分离它们。
鉴于以下情况:
Cargo.toml
[dependencies]
kuchiki = "0.8.1"
main.rs
use kuchiki::traits::TendrilSink;
let content = "\
<html>\
<head></head>\
<body>\
<div>div </div>\
<script type='text/javascript'>script </script>\
<noscript>noscript </noscript>\
<span>span</span>\
</body>\
</html>";
let parser = kuchiki::parse_html().one(content);
for child in parser.inclusive_descendants() {
if let Some(el) = child.as_element() {
println!("{}", el.name.local);
}
}
// println!("{}", parser.text_contents());
我们做获取所有节点:
html
head
body
div
script
noscript
span
当使用 text_contents()
迭代它们 和 像上面那样分离它们时,迭代器似乎在第一个分离节点之后失去了跟踪:
div noscript span
它似乎也不依赖于标签的类型,因为切换<noscript>
和<script>
标签的顺序给了我们:
div script span
我发现在首先收集它们之后分离节点似乎确实有效:
parser
.inclusive_descendants()
.filter(|node| {
node.as_element().map_or(false, |e| {
matches!(e.name.local.as_ref(), "script" | "style" | "noscript")
})
})
.collect::<Vec<_>>()
.iter()
.for_each(|node| node.detach());
println!("{}", parser.text_contents());
div span
我正在尝试获取 HTML 页面上的所有文本,不可见文本除外(例如:我不希望 script/style/noscript 标签内的文本)。
这是我到目前为止的想法:
let parser = kuchiki::parse_html().one(content);
for child in parser.inclusive_descendants() {
if let Some(el) = child.as_element() {
let tag_name = &el.name.local;
if tag_name == "script" || tag_name == "style" || tag_name == "noscript" {
child.detach();
}
}
}
let text = parser.text_contents();
println!("{}", text);
想法是第 1 遍将删除任何 script
、style
或 noscript
标签。然后我可以调用 text_contents
来获取可见文本。
但是,text_contents
似乎仍在返回内联 Javascript。
我是不是理解错了 Kuchiki/html5ever API?
inclusive_descendants()
迭代器似乎不喜欢迭代节点 和 分离它们。
鉴于以下情况:
Cargo.toml
[dependencies]
kuchiki = "0.8.1"
main.rs
use kuchiki::traits::TendrilSink;
let content = "\
<html>\
<head></head>\
<body>\
<div>div </div>\
<script type='text/javascript'>script </script>\
<noscript>noscript </noscript>\
<span>span</span>\
</body>\
</html>";
let parser = kuchiki::parse_html().one(content);
for child in parser.inclusive_descendants() {
if let Some(el) = child.as_element() {
println!("{}", el.name.local);
}
}
// println!("{}", parser.text_contents());
我们做获取所有节点:
html
head
body
div
script
noscript
span
当使用 text_contents()
迭代它们 和 像上面那样分离它们时,迭代器似乎在第一个分离节点之后失去了跟踪:
div noscript span
它似乎也不依赖于标签的类型,因为切换<noscript>
和<script>
标签的顺序给了我们:
div script span
我发现在首先收集它们之后分离节点似乎确实有效:
parser
.inclusive_descendants()
.filter(|node| {
node.as_element().map_or(false, |e| {
matches!(e.name.local.as_ref(), "script" | "style" | "noscript")
})
})
.collect::<Vec<_>>()
.iter()
.for_each(|node| node.detach());
println!("{}", parser.text_contents());
div span