使用Java解析HTML标记

时间:2014-04-21 23:11:19

标签: java html html-parsing

我正在尝试创建一个HTML解析器来检查HTML标记,并验证是否存在与每个打开标记相对应的结束标记。

我现在所做的部分工作并且我认为逻辑是正确的,但是我遇到了使令牌正确的问题。当我运行我的代码时,需要很多空标记,当与其他非空标记进行比较时,显然会产生错误。

我想知道如何从HTML文件中读取它,但只将事物放入介于<之间的标记中。和>。我也不想要任何额外的数据,例如h1标签之间的文本要考虑到令牌。

这是针对学校作业的,我相信教授希望我们在不使用第三方程序的情况下这样做,比如JTidy。

非常感谢任何帮助。

import java.util.Scanner;
import java.util.StringTokenizer;
import java.io.*;


public class HTMLDriver
{
   public static void main(String [] args) throws IOException
   {
     // declare variables
     QueueReferenceBased queue = new QueueReferenceBased();

     // Create a scanner object 

     Scanner in = new Scanner(System.in);
     System.out.println("What is your html file name?");
     String fileName = in.next();

     File userFile = new File(fileName);

     if (!userFile.exists())
     {
        System.out.println("File does not exist. This program will now exit.");
        System.exit(0);
     }

    Scanner inputFile = new Scanner(userFile); 
    while (inputFile.hasNext())
    {

        String str = inputFile.nextLine();
        StringTokenizer st = new StringTokenizer(str,"<>");

       //Adds tokens to queue
       while(st.hasMoreTokens())
       {
       String token = st.nextToken();
       Tag t = new Tag(token);
       queue.enqueue(t);
      }
    }   
    //Creates Stack
    StackReferenceBased stack = new StackReferenceBased();

    //Loops through queue if not empty
    while(!queue.isEmpty())
    {
      Object obj = queue.dequeue();
      Tag t2 = (Tag)obj;

        if(t2.getOpen() == true)
        {
           stack.push(t2);
        }

        if(t2.getOpen() == false)
        {
           if(stack.isEmpty())
           {
              System.out.println("There is no match for the " + t2 + " tag");
           }else
           {
              Object obj2 = stack.pop();
              Tag t3 = (Tag)obj2;

              //Make tag class and check equality

              if(t2.getTag().equals(t3.getTag()))
              {
                 System.out.println(t2 + " matches " + t3);
              }else
              {
                 System.out.println("Found " + t2 + " to match " + t3 + " terminating program");
                 System.exit(0);
              }

           }
        }
    }    
  }   
}

1 个答案:

答案 0 :(得分:0)

不要这样做。 Html在这方面臭名昭着。一些标签没有打开/关闭&lt; &GT; - 然后就是所有格式错误的HTML和浏览器怪异。

除非你的教授明确地将你排除在使用第三方免费软件之外,否则这是一种疯狂的尝试。在XML上,这是可管理的。

如果你真的,真的必须自己做这件事,可以使用正则表达式获得不错的结果

Pattern p = Pattern.compile("<(.*)>") // will get your started. you can then do:

Matcher m = p.matcher();
m.group( ... ) // this will get you everything between parentheses in the regex