Maneira rápida de encontrar um valor em HTML (Java)
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]
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
- Abra um
java.net.HttpURLConnection
- Obtenha um fluxo de entrada usando
getInputStream
- Use a expressão regular na resposta de Mike para analisar a parte desejada