HTML Parser

5 respostas
M

Olá pessoal!

Estou realizando um trabalho da faculdade, e estou tendo dificuldades para realizar o parser em html do meu código.

Estou conseguindo realizar a busca de qualquer DNS digitado pelo usuário, porém o meu "System.out.println" mostra todo o código fonte html.

Se alguém puder me dar uma dica de qual biblioteca com o javadoc desta APi de como implementar ao meu código, agradeço.

Abaixo segue o que consegui realizar!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;



public class Principal {

	public static void main(String[] args){

		System.out.println("Bem Vindo! ");

		Scanner ler = new Scanner(System.in);

		System.out.print("\nDigite aqui o endereço Http: ");

		String principal = ler.nextLine();
		
		System.out.println("\n" + principal + "\n");

	

		URL url;

		try {

			// get URL content
		//	String principal = null;
			url = new URL(principal);
			
			URLConnection conn = url.openConnection();

			// open the stream and put it into BufferedReader
			BufferedReader br = new BufferedReader(
					new InputStreamReader(conn.getInputStream()));

			String inputLine;


			while ((inputLine = br.readLine()) != null){
				System.out.println(inputLine);
			}
			br.close();

			System.out.println("Done");

		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}	

	}

}

5 Respostas

E

Mauricio Hirsch:
Olá pessoal!
Estou conseguindo realizar a busca de qualquer DNS digitado pelo usuário, porém o meu “System.out.println” mostra todo o código fonte html.

Pergunta. Uma vez que você fez o parsing, o que vai fazer com os dados?

a) Vou procurar a tag e imprimir apenas o título dessa página. (Precisa de mais?)

b) Vou remover todas as tags e comentários, e vou imprimir apenas o texto. (Serve para alguma coisa útil? Texto bruto de um site normalmente não serve para muita coisa)

c) Alguma coisa que você não pensou ainda.

O curl (um programa do Linux que puxa páginas a partir de uma URL) não faz qualquer parsing porque supõe-se que o usuário vá fazer alguma coisa útil com o HTML depois.

M

Olá amigo!

Desculpa-me acabei não expressando claramente o meu problema!

O que eu preciso é colher no código html e mostra todos os link de qualquer página pesquisada no programa, porém eu apenas estou conseguindo mostrar o código fonte HTML.

Estou pensando em alguma forma mas não encontrei ainda alguma forma, por isso estou aceitando e pedindo sugestões de alguém possa me ajudar.

Eu pensei em programar em um método de enlace que percorra todo o código fonte html e coloque em um ArrayList, após finalizando com System.

<a href="http://sourceforge.net/projects/jerichohtml">
E

Ah, entendi - você quer achar os links. Se for só para isso, e nada mais, basta usar uma expressão regular.

Suponha que (para simplificar) todos os links sejam encontrados via .

A expressão regular seria algo parecido com:

href="([^"]+)"

só que algo mais complicado.

Exemplo.

import java.io.*;
import java.util.regex.*;

class SepararLinks {
    public static void main (String[] args) {
	    BufferedReader br = null;
		Pattern pat = Pattern.compile ("href\\s*=\\s*(\"([^\"]+)\"|'([']+)')", Pattern.CASE_INSENSITIVE);
		try {
		    br = new BufferedReader (new FileReader (args[0]));
			for (String line = br.readLine(); line != null; line = br.readLine()) {
				Matcher mat = pat.matcher (line);
				while (mat.find()) {
					System.out.println (mat.group (2).isEmpty() ? mat.group (3) : mat.group (2));
				}
			}
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}
}
E

Aconselharia a pôr os links em um Set em vez de um ArrayList porque os links se repetem muito em uma página :slight_smile: - você quer baixar um link apenas uma vez.

M

Implementei o seu código no meu, mas confesso que não entendi muito bem, você poderia me explicar melhor?

E está rodando mas gera uma
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
	at Principal.main(Principal.java:64)exception
import java.io.InputStreamReader;  
import java.net.MalformedURLException;  
import java.net.URL;  
import java.net.URLConnection;  
import java.util.ArrayList;
import java.util.Scanner;  
import java.util.regex.Matcher;
import java.util.regex.Pattern;



public class Principal {  

	public static void main(String[] args){  

		System.out.println("Bem Vindo! ");  

		Scanner ler = new Scanner(System.in);  

		System.out.print("\nDigite aqui o endereço Http: ");  

		String principal = ler.nextLine();  

		System.out.println("\n" + principal + "\n");  

	//	Pattern pat = Pattern.compile ("href\\s*=\\s*(\"([^\"]+)\"|'([']+)')", Pattern.CASE_INSENSITIVE);
		
		
		URL url;  

		try {  

			// get URL content  
			//  String principal = null;  
			url = new URL(principal);  

			URLConnection conn = url.openConnection();  

			// open the stream and put it into BufferedReader  
			BufferedReader br = new BufferedReader(  
					new InputStreamReader(conn.getInputStream()));  

			String inputLine;  


			while ((inputLine = br.readLine()) != null){  
				System.out.println(inputLine);  
			}  
			br.close();  

			System.out.println("Done");  

		} catch (MalformedURLException e) {  
			e.printStackTrace();  
		} catch (IOException e) {  
			e.printStackTrace();  
		}  
		
		Pattern pat1 = Pattern.compile ("href\\s*=\\s*(\"([^\"]+)\"|'([']+)')", Pattern.CASE_INSENSITIVE);
		try {  
			BufferedReader br = new BufferedReader (new FileReader (args[0]));  
			for (String line = br.readLine(); line != null; line = br.readLine()) {  
				Matcher mat = pat1.matcher (line);  
				while (mat.find()) {  
					System.out.println (mat.group (2).isEmpty() ? mat.group (3) : mat.group (2));  
				}  
			}  
		} catch (IOException ex) {  
			ex.printStackTrace();  
		}  
	}  

}

Desde já fico muito grato pela sua atenção!

Criado 6 de março de 2013
Ultima resposta 9 de mar. de 2013
Respostas 5
Participantes 2