• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

kaskinho

html e java(urgente)

8 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

realmente é urgente... e aposto que andas a fazer um trabalho para Engenharia Informática (LAPR1) no ISEP :)

porque se é o caso, estamos os dois na mesma situação  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

Anyway.

o que tens a fazer é ler documentação. :D

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 :D

google -> java html table parser

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

     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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora