Pregunta

Usando expresiones regulares, ¿cuál es la forma más sencilla de obtener el HTML de un sitio web y encontrar el valor dentro de esta etiqueta (o el valor de cualquier atributo):

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

Solución

Depende de qué tan sofisticada sea la solicitud Http que necesite crear (autenticación, etc.).Aquí hay una forma sencilla que he visto utilizada en el pasado.

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));
}

Probablemente se encuentren muchos errores tipográficos aquí cuando se compila.(espero que esto no haya sido tarea)

Otros consejos

Es sorprendente cómo nadie, cuando aborda el problema del uso de RegEx con HTML, se enfrenta con frecuencia al problema de HTML. NO estar bien formado, lo que hace que muchos analizadores HTML sean completamente inútiles.

Si está desarrollando herramientas para analizar páginas web y es un hecho que no son HTML bien formados, la afirmación "Regex nunca debe usarse para analizar HTML" y "use un analizador HTML" es completamente falsa.Los hechos son que en el mundo real, las personas crean HTML como les apetece, y no necesariamente es adecuado para analizadores.

expresión regular es una forma completamente válida de encontrar elementos en texto, por tanto en HTML.Si hay alguna otra forma razonable de enfrentar los problemas que tiene el póster original, publíquelos en lugar de hacer referencia a una declaración de "usar un analizador" o "RTFM".

Deberías utilizar la consulta XPath.

Es tan simple como obtener el valor de /html/head/meta[@name=generator]/@value.

Un buen tutorial: Analizar un documento XML con XPath

Es posible que desee consultar la documentación del paquete org.apache.commons.HttpClient de Apache y los paquetes relacionados. aquí.Enviar una solicitud HTTP desde una aplicación Java es bastante fácil de hacer.Hojear la documentación debería llevarlo en la dirección correcta.

Estrictamente hablando, no puedes estar seguro de haber obtenido el valor correcto, ya que la metaetiqueta puede estar comentada o puede estar en mayúsculas, etc.Depende de qué tan seguro esté de que el HTML puede considerarse "agradable".

Eso depende.

Si está extrayendo información de un sitio o sitios que garantizan un HTML bien formado y sabe que <meta> no se ofuscará de alguna manera, entonces lea la sección <head> línea por línea y aplique una expresiones regulares es un buen enfoque.

Por otro lado, si el HTML puede estar alterado o ser "complicado", entonces necesita utilizar un analizador HTML adecuado, posiblemente uno permisivo como HTMLTidy.Tenga cuidado con el uso de un analizador HTML o XML estricto en material rastreado desde sitios web aleatorios.Muchos de los llamados HTML que encuentras en realidad están mal formados.

No he probado esto, pero ¿no sería el marco básico?

  1. Abre un java.net.HttpURLConnection
  2. Obtener un flujo de entrada usando getInputStream
  3. Utilice la expresión regular en la respuesta de Mike para analizar la parte que desea
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top