如何使用JSOUP获得文本与给定单词列表中的大多数单词匹配的特定标记?

时间:2019-05-05 09:14:03

标签: java jsoup

我正在尝试获取整个标签,该标签在给定的单词列表中具有匹配的最大单词数! 例如:考虑html:

<div id="productTitle" class="a-size-large">Hello world, good morning, have a happy day</div> <div id="productTitle2" class="a-size-large">Hello people of this planet!.</div>

使用jsoup lib考虑Java代码:

String html = "<div id="productTitle" class="a-size-large">Hello world, good morning, have a happy day</div> <div id="productTitle2" class="a-size-large">Hello people of this planet!.</div>";
Document doc = Jsoup.parse(html);    
List<String> words = new ArrayList<>(Arrays.asList("hello", "world", "morning"));
Element elmnt = doc.select("*:matchesOwn("+words+")");
System.out.println(elmnt.cssSelector());

预期输出: #productTitle

1 个答案:

答案 0 :(得分:0)

不幸的是,没有这样的选择器。您可以创建一个执行该操作的小算法:

使用Document.getAllElements()获取文档中所有元素的列表。要获取元素的实际文本,请使用Element.ownText()。现在,您可以将文本拆分为单词并计算所有单词:

String html = "<div id=\"productTitle\" class=\"a-size-large\">Hello world, good morning, have a happy day</div> <div id=\"productTitle2\" class=\"a-size-large\">Hello people of this planet!.</div>";
Document doc = Jsoup.parse(html);
List<String> words = Arrays.asList("hello", "world", "morning");

Element elmnt = doc.getAllElements().stream()
        .collect(Collectors.toMap(e -> countWords(words, e.ownText()), Function.identity(), (e0, e1) -> e1, TreeMap::new))
        .lastEntry().getValue();

这使用Java流和TreeMap将单词数映射到元素。如果两个或多个元素具有相同数量的单词,则使用最后一个ist。我想先使用(e0, e1) -> e0

要计算列表中给定的单词,您还可以使用Java Streams。您可以使用如下方法:

private long countWords(List<String> words, String text) {
    return Arrays.stream(text.split("[^\\w]+"))
            .map(String::toLowerCase)
            .filter(words::contains)
            .count();
}

这会将所有非单词字符分割为文本。您可以根据自己的需要进行更改。

对于您共享的HTML代码,elmnt.cssSelector()的结果将是#productTitle