Jump to content

html e java(urgente)


kaskinho

Recommended Posts

ola. eu tenho um trabalho pa fazer em que tenho de ler uma matriz de uma pagina html atraves de um programa em java(net beans) e manipular as respectivas matrizes!

o que eu queria fazer e como faço para lker o tal ficheiro trabalha-lo e depois colocar novamente em ficheiro html e tb em ficheiro de texto. podem ajudar-me e muito importante

obrigada a tds

ou entao converter a matriz de html para um ficheiro de texto txt e vice  versa

Sandra Monteiro

Link to comment
Share on other sites

Bem, não menos urgente é ler as regras des forum ( Links na minha assinatura ) 🙂

Anyway.

o que tens a fazer é ler documentação. 😄

Mas aqui vai uma ajuda para saberes para onde te virar.

Primeiro precisas de uma biblioteca http para fazeres download de uma pagina facilmente

Eu pesquisei no google e encontrei por exemplo esta:

http://www.innovation.ch/java/HTTPClient/

Tem exemplos de código, pode pegar neles e adaptar às tuas necessidade

Depois precisas de parsar o html para dentro de uma estrutura de dados. Eu pegava em expressões regulares e "toma lá morangos", era logo. Mas para quem não sabe o que são expressões regulares é capaz de não ser a melhor ideia pois demora um pouco de tempo a aprender.

O melhor se calhar é mesmo ires caracter a caracter e ires guardando numa pilha ( FIFO ) informação sobre as tags abertas.

Ou então, se o teu professor não se importar, pega num parser existente e usa-o 😄

google -> java html table parser

Link to comment
Share on other sites

Podes saltar o HTTPClient o Java já tem libs para isso

http://java.sun.com/javase/6/docs/api/java/net/URL.html

http://java.sun.com/javase/6/docs/api/java/net/URLConnection.html

Com estas duas classes consegues ligar ao site fazer o pedido e sacar o html com o getInputStream depois é só fazer a leitura do html linha a linha e retirar o que queres para um matriz ou lá o onde queres guardar isso 🙂

I haven’t lost my mind; it’s backed up on DVD somewhere!

Link to comment
Share on other sites

Bem, estava a responder a http://www.portugal-a-programar.pt/forums/topic/0-find-topic/?do=findComment&comment=155191 quando fui bloqueado 🙂

Mas coloco aqui a resposta...

Sendo que a dificuldade de obter o texto está ultrapassada, seja ler do disco ou usar as classes correctas para obter os dados da web, o parsing pode ser feito de várias maneiras.

A forma com eu faria isso seria com expressões regulares, lendo linha a linha retirava o texto que interessa.

Sem expressões regurales, continuas a ler linha a linha mas terá de fazer toda a lógica para obter os dados, por exemplo: encontras o "<" então ignoras tudo até "/>" ou ">", depois guarda tudo até o próximo "<". Vais repetindo isto até obteres os dados que queres.

Mas um exemplo mais concreto, usando expressões regulares o seguinte método encontra os valores numa linha do tipo:

<tr><td>m11</td><td>m12</td><td>...</td><td>m1y</td></tr>

    private void find(String test) {
        Pattern p = Pattern.compile("<td>(\\w+)</td>");
        Matcher m = p.matcher(test);
        while(m.find()) {
            System.out.println(m.group(1));
        }
    }

Quando a linha contém as tags <td></td> o código obtém todo o texto que se encontre no seu interior. O output disso será algo com:

m11
m12
m1y
Link to comment
Share on other sites

  • 3 weeks later...
     public Matriz lerHTML() throws FileNotFoundException
    {
        int x=0,y=0,base=0;
        Scanner ler=new Scanner(new File(getPathHTML()));
        String l="";
        String [] pal= new String [99];
        float[][] m=new float[30][30];
        
        int c=0;
        while(ler.hasNextLine())
        {
           l=ler.nextLine();
           if(l.toLowerCase().startsWith("<tr><td>"))
           {
                l=l.substring(8, l.length()-10);
                l=l.replaceAll(",", ".");
                pal=l.toLowerCase().split("</td><td>");
                /*for(int r=0;r<pal.length;r++){
                    System.out.println(pal[r]);
                }*/
                
                switch(c)
                {
                    case 0:break;
                    case 1:x=Integer.parseInt(pal[0]); break;
                    case 2:y=Integer.parseInt(pal[0]); break;
                    case 3:base=Integer.parseInt(pal[0]); break;
                    default:for (int j=0;j<y;j++)
                                m[c-4][j]=Float.parseFloat(pal[j]);
                                break;
                }
                c++;
           }
        }
        ler.close();
        mat=new Matriz(m, x, y, base);
        return mat;
    }
            
    public void escreverHTML(Matriz m) throws FileNotFoundException
    {
        Formatter fo=new Formatter(new File(getPathHTML()));
        String str="";
        
        str=str+"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n\"http://www.w3.org/TR/html4/strict.dtd\">\n"+
                "<html>\n<head>\n<title>Texto geral...</title>\n</head>\n<body>\n" +
                "<p>Texto geral...</p>\n"+"<table>\n<tr><td>Texto sobre a matriz...</td></tr>\n";
        str=str+"<tr><td>"+m.getX()+"</td></tr>\n";
        str=str+"<tr><td>"+m.getY()+"</td></tr>\n";
        str=str+"<tr><td>"+m.getBase()+"</td></tr>\n";
        
        str=str+"</table>\n<table>\n";
        for(int i=0;i<m.getX();i++)
        {
            str=str+"<tr>";
            for(int j=0;j<m.getY();j++)
            {
                str=str+"<td>"+m.getM()[i][j]+"</td>";
            }
            str=str+"</tr>\n";
        }
        str=str+"</table>\n</body>\n</html>";
        fo.format("%s",str);
        fo.close();
    }

Este foi o codigo que estou a utilizar para o projecto do ISEP, está feito para uma estrutura de Matriz, constituida por uma estrutura de array (matriz), um x, um y e uma base, de acordo com o projecto.

Espero que ajude. cumpz

Link to comment
Share on other sites

  • 3 years later...

Olá, desde já obrigado por teres postado este código.

http://www.portugal-a-programar.pt/forums/topic/0-find-topic/?do=findComment&comment=155220

No entanto, eu estou a utiliza-lo e não está a servir-me correctamente. Imaginemos que tenho uma String com toda a informação contida no ficheiro html.

Algo assim :

 

 while(fIn1.hasNext()){
           axu+=fIn1.nextLine();
         }

Ao chamar o método find ele não printa qualquer valor ->

private static void find(String test) {
        Pattern p = Pattern.compile("<td>(\\w+)</td>");
        Matcher m = p.matcher(test);
        while(m.find()) {
            System.out.println(m.group(1));
        }
    }

No debug verifico que ele não chega a printar, entra no while e sai imediatamente.

Obrigado por qualquer ajuda que possas prestar,

Abraço.

Link to comment
Share on other sites

Se não entrou no ciclo então a pesquisa não encontrou qualquer resultado.

Esse exemplo, que até fui eu que coloquei, é bastante limitado e pode não ser adequado ao tipo de input que tens. É preciso verificar como vem o texto que estás a pesquisar e criar uma expressão regular que seja mais robusta e que se adapte melhor.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.