从HTML中获取不同的元素

时间:2014-11-11 14:40:04

标签: java html groovy jsoup

我想从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 {
        []
    }
}

2 个答案:

答案 0 :(得分:0)

您是否还可以使用jquery来实现您的目标?

做类似的事情:

 $('.buisness_card').each(function(i, obj) {
    $(this).text(); //Maybe set a variable here
}); 

这应循环遍历buisness_card div并获取此div中的html值并返回每个内部的文本内容。我做了一个jsfiddle来显示以下内容:

示例: http://jsfiddle.net/qrqxf9tk/

希望我能正确地读你并在这里理解你,jQuery可能是一个选择。

修改

该按钮只与empty()append()一起设置一个可用的示例,以便您可以看到它发生,显然oyu可以使用它而无需其中任何一个。

答案 1 :(得分:0)

如何:迭代所有子节点,并将包含有趣节点的子节点添加到节点的结果中。那些孩子从当前节点中删除。如果&#34;剩下的&#34;节点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>