Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将HTML解析为纯文本,但保留每个字符的标记信息_Java_Html_Jsoup_Html Parsing - Fatal编程技术网

Java 将HTML解析为纯文本,但保留每个字符的标记信息

Java 将HTML解析为纯文本,但保留每个字符的标记信息,java,html,jsoup,html-parsing,Java,Html,Jsoup,Html Parsing,我正在寻找一种解析HTML或标记的方法,但我可以将其转换为HTML到纯文本,然后依次确定哪些标记适用于每个字符 例如,如果我有以下HTML: <p>Hello <em>world</em>!</p> 并能够查询不同的字符,以找出适用的标记: Character 0 -> H -> p Character 1 -> e -> p Character 2 -> l -> p ... Character 6 ->

我正在寻找一种解析HTML或标记的方法,但我可以将其转换为HTML到纯文本,然后依次确定哪些标记适用于每个字符

例如,如果我有以下HTML:

<p>Hello <em>world</em>!</p>
并能够查询不同的字符,以找出适用的标记:

Character 0 -> H -> p
Character 1 -> e -> p
Character 2 -> l -> p
...
Character 6 -> w -> p, em
Character 7 -> o -> p, em
...
Character 11 -> ! -> p
有人能提出一个这样做的方法吗?听起来应该不会太难,所以我怀疑我只是在寻找错误的术语来找到合适的东西

理想情况下,这将使用JSoup或类似的东西,但如果其他方法和库有效,我们很乐意使用它们

更新:另外,我需要能够分开相邻的相同标签。因此,对于HTML:

<p>Hello</p><p>World</p>

我将能够识别p1和p2。

您可以对html标记和其中的字符串进行基于堆栈的解析,可以在从堆栈中弹出元素时存储位置

@Test
public void testCharMapping() {
    charMapping("<p>Hello <em>world</em>!</p>");
    charMapping("<p>Hello</p><p>World</p>");
}

private void charMapping(String html) {
    System.out.println("char mapping for : " + html);
    for (Element e : Jsoup.parse(html).select("*")) {
        if (e.ownText() != null && !e.ownText().isEmpty())
            for (char c : e.ownText().toCharArray())
                System.out.println(c + " -> " + e.cssSelector());
    }
    System.out.println("====================");
}
答复:

char mapping for : <p>Hello <em>world</em>!</p>
H -> html > body > p
e -> html > body > p
l -> html > body > p
l -> html > body > p
o -> html > body > p
  -> html > body > p
! -> html > body > p
w -> html > body > p > em
o -> html > body > p > em
r -> html > body > p > em
l -> html > body > p > em
d -> html > body > p > em
====================
char mapping for : <p>Hello</p><p>World</p>
H -> html > body > p:nth-child(1)
e -> html > body > p:nth-child(1)
l -> html > body > p:nth-child(1)
l -> html > body > p:nth-child(1)
o -> html > body > p:nth-child(1)
W -> html > body > p:nth-child(2)
o -> html > body > p:nth-child(2)
r -> html > body > p:nth-child(2)
l -> html > body > p:nth-child(2)
d -> html > body > p:nth-child(2)
====================

开始逐字阅读。寻找一个开放的括号<和后面的字符串直到一个结束>。这是一个开始标记。将此标记放入堆栈中。在这之后,看看接下来发生的事情,这并不能维持字符的顺序。也就是说在“世界”之前。使用Jsoup获取字符的顺序可能会更困难。
char mapping for : <p>Hello <em>world</em>!</p>
H -> html > body > p
e -> html > body > p
l -> html > body > p
l -> html > body > p
o -> html > body > p
  -> html > body > p
! -> html > body > p
w -> html > body > p > em
o -> html > body > p > em
r -> html > body > p > em
l -> html > body > p > em
d -> html > body > p > em
====================
char mapping for : <p>Hello</p><p>World</p>
H -> html > body > p:nth-child(1)
e -> html > body > p:nth-child(1)
l -> html > body > p:nth-child(1)
l -> html > body > p:nth-child(1)
o -> html > body > p:nth-child(1)
W -> html > body > p:nth-child(2)
o -> html > body > p:nth-child(2)
r -> html > body > p:nth-child(2)
l -> html > body > p:nth-child(2)
d -> html > body > p:nth-child(2)
====================