我正在使用Jericho HTML Parser来解析一些格式错误的 html。特别是我试图获取所有文本节点,处理文本然后替换它。
我想跳过处理中的特定元素。例如,我想跳过所有元素,以及任何具有属性 class="noProcess" 的元素。所以,如果一个 div 有 class="noProcess" 那么我想跳过这个 div 和所有子进程。但是,我确实希望这些跳过的元素在处理后返回到输出。
Jericho 为所有节点提供了一个迭代器,但我不确定如何从迭代器中跳过完整的元素。这是我的代码:
private String doProcessHtml(String html) {
Source source = new Source(html);
OutputDocument outputDocument = new OutputDocument(source);
for (Segment segment : source) {
if (segment instanceof Tag) {
Tag tag = (Tag) segment;
System.out.println("FOUND TAG: " + tag.getName());
// DO SOMETHING HERE TO SKIP ENTIRE ELEMENT IF IS <A> OR CLASS="noProcess"
} else if (segment instanceof CharacterReference) {
CharacterReference characterReference = (CharacterReference) segment;
System.out.println("FOUND CHARACTERREFERENCE: " + characterReference.getCharacterReferenceString());
} else {
System.out.println("FOUND PLAIN TEXT: " + segment.toString());
outputDocument.replace(segment, doProcessText(segment.toString()));
}
}
return outputDocument.toString();
}
它看起来不像使用 ignoreWhenParsing() 方法对我有用,因为解析器只是将“忽略”元素视为文本。
我在想,如果我可以将 Iterator 循环转换为 for (int i = 0;...) 循环,我可能能够通过修改 i 指向 EndTag 来跳过元素及其所有子元素,然后继续循环....但不确定。