jsoup 删除外部 html 标签 - 代码 HTML 元素
jsoup remove outer html tag - code HTML element
这看起来很简单,但显然我做错了什么。这是我的 HTML - 我正在尝试在 pre 标签下创建单个代码标签和嵌套代码标签 - 结果内容将是 "one line boxes with code inside" 并且还有 pre 标签 "big boxes with code inside"。还有一些空段落标签,我无法使用标准方法摆脱它们 - 在测试段落中没有文本后删除元素。这是输入
<h1>Module Description and Learning Objectives</h1>
<p>
</p>
<pre>
<p>
<code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 -</code>
</p>
<p>
<code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title</code>
</p>
<p>
<code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1</code>
</p>
<p>
</p>
</pre>
<p>Sentence 1</p>
<p>
<code>System.out.println("id:"+element.attr("id"));</code>
</p>
<p>Sentence 2</p>
<p>
<code>System.out.println("src:"+element.attr("src"));</code>
</p>
<p>Sentence 3</p>
<p>
<code>System.out.println("alt:"+element.attr("alt"));</code>
</p>
<p>
</p>
这是我的代码(不要像构造一样遵循名称,中间代码名称:)
Elements pWithCodeTagList = docXMLformat.select("code");
if (pWithCodeTagList.size() > 0) {
for (Element pTag : pWithCodeTagList) {
System.out.println("pTag=" + pTag.text() + " " + pTag.tagName());
pTag.unwrap();
}
}
这是 eclipse 中的输出 - 我确实选择了代码标签并期望父 p 消失
pTag=2020-02-13 12:49:15 DEBUG StackTraceElement:48 - code
pTag=2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title code
pTag=2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1 code
pTag=System.out.println("id:"+element.attr("id")); code
pTag=System.out.println("src:"+element.attr("src")); code
pTag=System.out.println("alt:"+element.attr("alt")); code
这是结果:我希望段落标签消失,而不是代码标签!
<h1>Module Description and Learning Objectives</h1>
<p>
</p>
<pre>
<p>
2020-02-13 12:49:15 DEBUG StackTraceElement:48 -
</p>
<p>
2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title
</p>
<p>
2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1
</p>
<p>
</p>
</pre>
<p>Sentence 1</p>
<p> System.out.println("id:"+element.attr("id")); </p>
<p>Sentence 2</p>
<p> System.out.println("src:"+element.attr("src")); </p>
<p>Sentence 3</p>
<p> System.out.println("alt:"+element.attr("alt")); </p>
<p>
</p>
我已经触及了文档的这个区域,在此之前我已经删除了代码标签周围的 span 标签,并且不得不从行内容中删除所有行控制字符,也许 PRE 和 CODE 没有像其他标签一样工作 - 我知道他们不应该这样做,但是......另外,我试图将标签和内容保持在同一行所以我的 "code boxes" 尽可能苗条,towit:
<pre>
<code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 -</code>
<code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title</code>
<code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1</code>
</pre>
<p>Sentence 1</p>
<code>System.out.println("id:"+element.attr("id"));</code>
<p>Sentence 2</p>
<code>System.out.println("src:"+element.attr("src"));</code>
<p>Sentence 3</p>
<code>System.out.println("alt:"+element.attr("alt"));</code>
您的 select 或正在 selecting code
元素,而不是 p
元素,这就是它们被删除的原因。您应该 select 具有 code
标签的 p
元素,以及 unwrap()
那些元素。 p:has(code)
此外,如果您想将它们全部展开,则不需要对它们进行迭代并在每个上调用展开(除非您想为每个执行额外的逻辑)。你可以打电话给 Elements#upwrap()
Elements pWithCodeTagList = docXMLformat.select("p:has(code)");
pWithCodeTagList.unwrap();
要查找空的 p
标签,您可以使用 :matches
select 或者对文本执行正则表达式,只查找空格或不查找任何内容:p:matches(^\s?$)
Elements emptyPs = docXMLformat.select("p:matches(^\s?$)");
emptyPs.remove();
这看起来很简单,但显然我做错了什么。这是我的 HTML - 我正在尝试在 pre 标签下创建单个代码标签和嵌套代码标签 - 结果内容将是 "one line boxes with code inside" 并且还有 pre 标签 "big boxes with code inside"。还有一些空段落标签,我无法使用标准方法摆脱它们 - 在测试段落中没有文本后删除元素。这是输入
<h1>Module Description and Learning Objectives</h1>
<p>
</p>
<pre>
<p>
<code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 -</code>
</p>
<p>
<code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title</code>
</p>
<p>
<code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1</code>
</p>
<p>
</p>
</pre>
<p>Sentence 1</p>
<p>
<code>System.out.println("id:"+element.attr("id"));</code>
</p>
<p>Sentence 2</p>
<p>
<code>System.out.println("src:"+element.attr("src"));</code>
</p>
<p>Sentence 3</p>
<p>
<code>System.out.println("alt:"+element.attr("alt"));</code>
</p>
<p>
</p>
这是我的代码(不要像构造一样遵循名称,中间代码名称:)
Elements pWithCodeTagList = docXMLformat.select("code");
if (pWithCodeTagList.size() > 0) {
for (Element pTag : pWithCodeTagList) {
System.out.println("pTag=" + pTag.text() + " " + pTag.tagName());
pTag.unwrap();
}
}
这是 eclipse 中的输出 - 我确实选择了代码标签并期望父 p 消失
pTag=2020-02-13 12:49:15 DEBUG StackTraceElement:48 - code
pTag=2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title code
pTag=2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1 code
pTag=System.out.println("id:"+element.attr("id")); code
pTag=System.out.println("src:"+element.attr("src")); code
pTag=System.out.println("alt:"+element.attr("alt")); code
这是结果:我希望段落标签消失,而不是代码标签!
<h1>Module Description and Learning Objectives</h1>
<p>
</p>
<pre>
<p>
2020-02-13 12:49:15 DEBUG StackTraceElement:48 -
</p>
<p>
2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title
</p>
<p>
2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1
</p>
<p>
</p>
</pre>
<p>Sentence 1</p>
<p> System.out.println("id:"+element.attr("id")); </p>
<p>Sentence 2</p>
<p> System.out.println("src:"+element.attr("src")); </p>
<p>Sentence 3</p>
<p> System.out.println("alt:"+element.attr("alt")); </p>
<p>
</p>
我已经触及了文档的这个区域,在此之前我已经删除了代码标签周围的 span 标签,并且不得不从行内容中删除所有行控制字符,也许 PRE 和 CODE 没有像其他标签一样工作 - 我知道他们不应该这样做,但是......另外,我试图将标签和内容保持在同一行所以我的 "code boxes" 尽可能苗条,towit:
<pre>
<code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 -</code>
<code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.title</code>
<code>2020-02-13 12:49:15 DEBUG StackTraceElement:48 - sects.id=1</code>
</pre>
<p>Sentence 1</p>
<code>System.out.println("id:"+element.attr("id"));</code>
<p>Sentence 2</p>
<code>System.out.println("src:"+element.attr("src"));</code>
<p>Sentence 3</p>
<code>System.out.println("alt:"+element.attr("alt"));</code>
您的 select 或正在 selecting code
元素,而不是 p
元素,这就是它们被删除的原因。您应该 select 具有 code
标签的 p
元素,以及 unwrap()
那些元素。 p:has(code)
此外,如果您想将它们全部展开,则不需要对它们进行迭代并在每个上调用展开(除非您想为每个执行额外的逻辑)。你可以打电话给 Elements#upwrap()
Elements pWithCodeTagList = docXMLformat.select("p:has(code)");
pWithCodeTagList.unwrap();
要查找空的 p
标签,您可以使用 :matches
select 或者对文本执行正则表达式,只查找空格或不查找任何内容:p:matches(^\s?$)
Elements emptyPs = docXMLformat.select("p:matches(^\s?$)");
emptyPs.remove();