在Java上按元素解析HTML元素

时间:2014-11-12 20:04:45

标签: java html parsing

我有一个HTML文件:



<div>
   DIV1
    <div>
      DIV2
       <div>
          DIV3
       </div>
    </div>
</div>
&#13;
&#13;
&#13;

我想解析那个HTML。但是,我不想将整个解析的HTML作为字符串:

DIV1 DIV2 DIV3

我想逐个元素地获取值,但没有重复。我的意思是我不想要那个:

当你得到第一个div的值时,它是:

DIV1 DIV2 DIV3

秒的div值:

DIV2 DIV3

第三个div的值:

DIV3

我不想要的结果是:

DIV1 DIV2 DIV3
DIV2 DIV3
DIV3

我想要那个结果:

DIV1
DIV2
DIV2

我会对他们应用一些程序,我也不想要重复的值。我想使用Java解析器来解决我的问题。我考虑过使用Jsoup,但是在使用它时会解析整个HTML。

1 个答案:

答案 0 :(得分:0)

听起来您想为HTML文档中的所有文本节点执行pre order depth first search。幸运的是,大多数解析库(包括XML库)都会按顺序为所有节点提供迭代器。

我建议您使用Jericho并致电getNodeIterator(),然后检查它是否为文本节点,是否将其打印出来。 Nootice链接有示例代码,但为了方便起见,我会将其粘贴到此处:

 for (Iterator<Segment> nodeIterator=segment.getNoteIterator(); nodeIterator.hasNext();) {
   Segment nodeSegment=nodeIterator.next();
   if (nodeSegment instanceof Tag) {
     Tag tag=(Tag)nodeSegment;
     // HANDLE TAG
     // Uncomment the following line to ensure each tag is valid XML:
     // writer.write(tag.tidy()); continue;
   } else if (nodeSegment instanceof CharacterReference) {
     CharacterReference characterReference=(CharacterReference)nodeSegment;
     // HANDLE CHARACTER REFERENCE
     // Uncomment the following line to decode all character references instead of copying them verbatim:
     // characterReference.appendCharTo(writer); continue;
   } else {
     // HANDLE PLAIN TEXT
   }
   // unless specific handling has prevented getting to here, simply output the segment as is:
   //writer.write(nodeSegment.toString());
 }

// HANDLE CHARACTER REFERENCE// HANDLE PLAIN TEXT中,您要添加字符串附加代码。