我正在尝试获取整个标签,该标签在给定的单词列表中具有匹配的最大单词数! 例如:考虑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
答案 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
。