gpt4 book ai didi

java - 从 HTML 中获取不同的元素

转载 作者:太空宇宙 更新时间:2023-11-04 14:24:00 24 4
gpt4 key购买 nike

我想从 HTML 页面获取包含一些文本的不同元素,以使冗余最小化。例如:

<div class="business_card">
<p><span id="title"><b><a href="board" target="_self">John ABC</a></b></span>
<br>
Director <br>
123 456 78<br>
<span class="email">
<a href="mailto:john.abc@example.com">Send me an email &raquo;</a> </span></p>
</div>

对于上面的 HTML,我希望将这些项目作为 Element :

  • <a href="board" target="_self">John ABC</a>
  • <a href="mailto:john.abc@example.com">Send me an email &raquo;</a>
  • <p>Director<br>123 456 78</b>

这是我编写的代码,到目前为止它运行得很好,除了上面的示例中,文本 Director 123 456 78 没有被收集。我尝试在 || element.ownText() != "" 之后添加 !element.isBlock() 但它会导致许多重复。

private static def collectChildren(Element element) {
if (element.children().size() > 0) {
element.children().collect { it ->
if (!element.isBlock())
[element, collectChildren(it)]
else collectChildren(it)
}
} else if (element.hasText() || element.attr("alt") != ""
|| element.attr("title") != "" || element.attr("href") != "") {
element
} else {
[]
}
}

最佳答案

这样怎么样:迭代所有子节点,并将那些包含有趣节点的节点添加到该节点的结果中。这些子节点将从当前节点中删除。如果“剩余”节点 hasText (仅删除空白节点)和 isBlock (可选),则也将此元素添加到结果中。

这至少适用于给定的示例。如果您希望 <p> 节点内没有其他有效元素,则必须构建它,或者必须通过删除不需要的元素来创建它。您可能仍然需要在剩余节点本身中进行一些额外的过滤(例如,还删除所有剩余的子节点,即 block )。我希望这能给人一些启发:

@Grab('org.jsoup:jsoup:1.8.1')
import org.jsoup.*
import org.jsoup.nodes.*

def doc = Jsoup.parse('''\
<div class="business_card">
<p>
<span id="title"><b><a href="board" target="_self">John ABC</a></b></span>
<br>
Director <br>
123 456 78<br>
<span class="email"><a href="mailto:john.abc@example.com">Send me an email &raquo;</a></span>
</p>
</div>''')

def collectChildren(Element element) {
if (element.children().size() > 0) {
def found = []
element.children().findAll{
def c = collectChildren(it).flatten()
if (c) {
found.addAll(c)
}
return c
}*.remove()
if (element.hasText() && element.isBlock()) {
found << element
}
found
} else if (element.hasText() || element.attr("alt") || element.attr("title") || element.attr("href")) {
[element]
} else {
[]
}
}

println collectChildren(doc.body()).flatten().join("\n")
// <a href="board" target="_self">John ABC</a>
// <a href="mailto:john.abc@example.com">Send me an email »</a>
// <p> <br> Director <br> 123 456 78<br> </p>

关于java - 从 HTML 中获取不同的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26867413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com