【发布时间】:2019-09-18 08:04:32
【问题描述】:
我试图以这样一种方式解析多个 html 文档,即我只得到丢弃其所有属性和值的标签。谁能帮帮我。
例如:<img src="pic_trulli.jpg" alt="Italian Trulli">
更改为
<img>
同样,我希望它适用于 HTML 文档中的所有标签。
【问题讨论】:
我试图以这样一种方式解析多个 html 文档,即我只得到丢弃其所有属性和值的标签。谁能帮帮我。
例如:<img src="pic_trulli.jpg" alt="Italian Trulli">
更改为
<img>
同样,我希望它适用于 HTML 文档中的所有标签。
【问题讨论】:
如果您的目标是获得清晰的文档结构,您还需要删除文本和数据节点。考虑以下 sn-p。
Document document = Jsoup.connect("http://example.com").get();
document.getAllElements().forEach(element -> {
element.attributes().asList().forEach(attr -> element.removeAttr(attr.getKey()));
element.textNodes().forEach(Node::remove);
element.dataNodes().forEach(Node::remove);
});
System.out.println(document);
输出:
<!doctype html>
<html>
<head>
<title></title>
<meta>
<meta>
<meta>
<style></style>
</head>
<body>
<div>
<h1></h1>
<p></p>
<p><a></a></p>
</div>
</body>
</html>
【讨论】:
要删除单个元素的属性,您可以使用:
element.attributes().asList()
.stream().map(Attribute::getKey)
.forEach(element::removeAttr);
要删除所有元素的属性,您可以将其与document.getAllElements() 结合使用:
Document document = Jsoup.parse("<img src=\"pic_trulli.jpg\" alt=\"Italian Trulli\">");
document.getAllElements()
.forEach(e -> e.attributes().asList()
.stream().map(Attribute::getKey)
.forEach(e::removeAttr));
结果会是这样的:
<html>
<head></head>
<body>
<img>
</body>
</html>
【讨论】:
您可以遍历文档中的所有元素,然后遍历每个元素的属性,这应该允许您删除它们。
演示:
String html = "<img src=\"pic_trulli.jpg\" alt=\"Italian Trulli\">" +
"<div class=\"foo\"><a href=\"pic_trulli.jpg\" alt=\"Italian Trulli\" non-standard></div>";
Document doc = Jsoup.parse(html);
System.out.println(doc);
for (Element el : doc.getAllElements()){
for (Attribute atr : el.attributes().asList()){
el.removeAttr(atr.getKey());
}
}
System.out.println("-----");
System.out.println(doc);
输出:
<html>
<head></head>
<body>
<img src="pic_trulli.jpg" alt="Italian Trulli">
<div class="foo">
<a href="pic_trulli.jpg" alt="Italian Trulli" non-standard></a>
</div>
</body>
</html>
-----
<html>
<head></head>
<body>
<img>
<div>
<a></a>
</div>
</body>
</html>
【讨论】: