Pergunta

Usando expressões regulares, qual é a maneira mais simples de buscar o HTML de um site e encontrar o valor dentro desta tag (ou o valor de qualquer atributo):

<html>
  <head>
  [snip]
  <meta name="generator" value="thevalue i'm looking for" />
  [snip]
Foi útil?

Solução

Depende de quão sofisticada é uma solicitação HTTP que você precisa criar (autenticação, etc.).Aqui está uma maneira simples que já vi usada no passado.

StringBuilder html = new StringBuilder();
java.net.URL url = new URL("http://www.google.com/");
BufferedReader input = null;
try {
    input new BufferedReader(
        new InputStreamReader(url.openStream()));

    String htmlLine;
    while ((htmlLine=input.readLine())!=null) {
        html.appendLine(htmlLine);
    }
}
finally {
    input.close();
}

Pattern exp = Pattern.compile(
    "<meta name=\"generator\" value=\"([^\"]*)\" />");
Matcher matcher = exp.matcher(html.toString());
if(matcher.find())
{
    System.out.println("Generator: "+matcher.group(1));
}

Provavelmente muitos erros de digitação aqui podem ser encontrados quando compilados.(espero que isso não tenha sido lição de casa)

Outras dicas

É incrível como ninguém, ao abordar o problema do uso de RegEx com HTML, enfrenta frequentemente o problema do HTML. NÃO sendo bem formado, tornando assim muitos analisadores de HTML completamente inúteis.

Se você está desenvolvendo ferramentas para analisar páginas da web e é fato que elas não são HTML bem formadas, a afirmação "Regex nunca deve ser usada para analisar HTML" e "use um analisador de HTML" é completamente falsa.Os fatos são que, no mundo real, as pessoas criam HTML como bem entendem - e não necessariamente adequado para analisadores.

RegEx é uma forma totalmente válida de encontrar elementos em texto, portanto em HTML.Se houver qualquer outra maneira razoável de enfrentar os problemas do autor da postagem original, publique-os em vez de referir-se a uma declaração "use um analisador" ou "RTFM".

Você deveria estar usando a consulta XPath.

É tão simples quanto obter o valor de /html/head/meta[@name=generator]/@value.

Um bom tutorial: Analisando um documento XML com XPath

Você pode querer verificar a documentação do pacote org.apache.commons.HttpClient do Apache e os pacotes relacionados aqui.Enviar uma solicitação HTTP de um aplicativo Java é muito fácil.Examinar a documentação deve colocá-lo na direção certa.

Estritamente falando, você não pode ter certeza de que obteve o valor correto, pois a meta tag pode estar comentada ou a meta tag pode estar em letras maiúsculas, etc.Depende de quão certo você tem de que o HTML pode ser considerado "legal".

Depende.

Se você estiver extraindo informações de um site ou sites que são garantidos como HTML bem formado, e você sabe que o <meta> não será ofuscado de alguma forma, então leia a seção <head> linha por linha e aplique um regex é uma boa abordagem.

Por outro lado, se o HTML puder ser distorcido ou "complicado", você precisará usar um analisador de HTML adequado, possivelmente um permissivo como o HTMLTidy.Cuidado ao usar um analisador HTML ou XML estrito em coisas coletadas de sites aleatórios.Muitos dos chamados HTML que você descobre estão, na verdade, malformados.

Eu não tentei isso, mas a estrutura básica não seria

  1. Abra um java.net.HttpURLConnection
  2. Obtenha um fluxo de entrada usando getInputStream
  3. Use a expressão regular na resposta de Mike para analisar a parte desejada
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top