使用Java在html中选择文本的一部分

梦想家

在问这个问题之前,我已经浏览了多种形式。基本上,我需要在HTML文件中选择部分文本。的HTML是这样构造的

<div class = "pane big">
<code>
<pre>
SomeText
<a id="par1" href="#par1">¶</a>
MoreText
.
.
.
<a id="par2" href="#par2">¶</a>
MoreText
</pre>
</code>
</div>

因此,我需要做的是自己提取href标记par1下的文本,然后分别获取par2 href标记下的文本。我尝试使用Jsoup,但我能做的就是选择整个div文本。也尝试过XPath,但是我正在评估的表达式不被接受。不知道可能是因为它不是XML开头的文件。

我使用的XPath表达式示例是。

/html/body/div/div[2]/code[2]/pre/text()[3]

和CSS

body > div > div.pane.big > code:nth-child(7) > pre
克罗威尔

使用纯CSS选择器不可能做到这一点,需要Java代码中的其他提取和附加逻辑:

  1. 选择前置元素
  2. 通过将其拆分的文本部分序列一个元素分离器。
  3. 跳过第一个元素,然后加入两个(或多个)下一个部分。

这里是简单的代码示例(带有流API的JDK 1.8样式和旧的JDK 1.5-1.7样式):

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;

import static java.util.Arrays.stream;
import static java.util.stream.Collectors.joining;

public class SimpleParser {
    public static void main(String[] args) throws IOException {
        final Document document = Jsoup.parse(new File("div.html"), "UTF-8");
        final Elements elements = document.select("div.pane.big pre");

        System.out.println("JDK 1.8 style");
        System.out.println(
                stream(elements.html().split("\\s+<a.+</a>\\s+"))
                        .skip(1)
                        .collect(joining("\n")
                        ));

        System.out.println("\nJDK 1.7 style");
        String[] textParts = elements.html().split("\\s+<a.+</a>\\s+");
        StringBuilder resultText = new StringBuilder();
        for (int i = 1; i < textParts.length; i++) {
            resultText.append(textParts[i] + "\n");
        }
        System.out.println(resultText.toString());
    }
}

PS请注意,HTML代码示例中的最后一个标签div应该为封闭标签。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章