leer - obtener datos de una pagina web con java
Obtener fuente de sitio web en java (8)
Me gustaría usar Java para obtener el origen de un sitio web (seguro) y luego analizar ese sitio web para ver los enlaces que contiene. He encontrado cómo conectarme a esa url, pero ¿cómo puedo obtener fácilmente la fuente, preferraby como DOM Document Oso que puedo obtener fácilmente la información que quiero?
¿O hay una mejor manera de conectarse al sitio https, obtener la fuente (lo que debo hacer para obtener una tabla de datos ... es bastante simple) entonces esos enlaces son archivos que voy a descargar.
Desearía que fuera FTP pero estos son archivos almacenados en mi tivo (quiero descargarlos programáticamente a mi computadora (
Hay dos significados de souce en un contexto web:
El origen HTML: si solicita una página web por URL, siempre obtiene el código fuente HTML. De hecho, no hay nada más que puedas obtener de la URL. Las páginas web siempre se transmiten en formato fuente, no existe una página web compilada . Y por lo que estás intentando, esto debería ser suficiente para cumplir tu tarea.
Fuente de script: si la página web se genera dinámicamente, se codifica en algún lenguaje de scripting del lado del servidor (como PHP, Ruby, JSP ...). También existe un código fuente en este nivel. Pero al usar una conexión HTTP no puede obtener este tipo de código fuente. Esta no es una característica que falta, sino completamente por propósito.
Análisis: Habiendo dicho eso, necesitarás analizar de alguna manera el código HTML. Si solo necesita los enlaces, usar un RegEx (como mostró Oscar Reyes) será el enfoque más práctico, pero también podría escribir un analizador simple "manualmente". Sería lento, más código ... pero funciona.
Si desea acceder al código en un nivel más lógico, analizarlo en un DOM sería el camino a seguir. Si el código es XHTML válido , simplemente puede analizarlo en org.w3c.dom.Document y hacer cualquier cosa con él. Si es al menos un código HTML válido , puede aplicar algunos trucos para convertirlo a XHTML (en algunos casos raros, reemplazarlo por <br/> y cambiar el tipo de documento es suficiente) y usarlo como XML.
Si no es XML válido, necesitaría un analizador HTML DOM. No tengo idea si existe algo así para Java y si funciona bien.
Probablemente puedas obtener mejores resultados de las opciones de Pete o sktrdie. Aquí hay una forma adicional si le gustaría saber cómo hacerlo "por tener"
No soy muy bueno en regex, así que en este caso devuelve el último enlace en una línea. Bueno, es un comienzo.
import java.io.*;
import java.net.*;
import java.util.regex.*;
public class Links {
public static void main( String [] args ) throws IOException {
URL url = new URL( args[0] );
InputStream is = url.openConnection().getInputStream();
BufferedReader reader = new BufferedReader( new InputStreamReader( is ) );
String line = null;
String regExp = ".*<a href=/"(.*)/">.*";
Pattern p = Pattern.compile( regExp, Pattern.CASE_INSENSITIVE );
while( ( line = reader.readLine() ) != null ) {
Matcher m = p.matcher( line );
if( m.matches() ) {
System.out.println( m.group(1) );
}
}
reader.close();
}
}
EDITAR
Ooops Me perdí totalmente la parte "segura". De todos modos no pude evitarlo, tuve que escribir esta muestra: P
Pruebe HttpUnit o HttpClient . Aunque el primero es ostensiblemente para escribir pruebas de integración, tiene una API conveniente para iterar programáticamente a través de los enlaces de una página web, con algo como el siguiente uso de WebResponse.getLinks () :
WebConversation wc = new WebConversation();
WebResponse resp = wc.getResponse("http://.com/questions/422970/");
WebLink[] links = resp.getLinks();
// Loop over array of links...
Puede usar javacurl para obtener el html del sitio y el DOM de Java para analizarlo.
Puedes obtener un nivel bajo y solo solicitarlo con un socket. En java parece
// Arg[0] = Hostname
// Arg[1] = File like index.html
public static void main(String[] args) throws Exception {
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsock = (SSLSocket) factory.createSocket(args[0], 443);
SSLSession session = sslsock.getSession();
X509Certificate cert;
try {
cert = (X509Certificate) session.getPeerCertificates()[0];
} catch (SSLPeerUnverifiedException e) {
System.err.println(session.getPeerHost() + " did not present a valid cert.");
return;
}
// Now use the secure socket just like a regular socket to read pages.
PrintWriter out = new PrintWriter(sslsock.getOutputStream());
out.write("GET " + args[1] + " HTTP/1.0/r/n/r/n");
out.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(sslsock.getInputStream()));
String line;
String regExp = ".*<a href=/"(.*)/">.*";
Pattern p = Pattern.compile( regExp, Pattern.CASE_INSENSITIVE );
while ((line = in.readLine()) != null) {
// Using Oscar''s RegEx.
Matcher m = p.matcher( line );
if( m.matches() ) {
System.out.println( m.group(1) );
}
}
sslsock.close();
}
Existe un servidor FTP que se puede instalar en su Tivo para permitir descargas de programas, consulte aquí http://dvrpedia.com/MFS_FTP
La pregunta se formula de forma diferente (cómo manejar http / html en java) pero al final mencionas lo que quieres es descargar programas. Tivo utiliza un sistema de archivos único (MFS - Media File System) propio, por lo que no es fácil montar la unidad en otra máquina; en cambio, es más fácil ejecutar el servidor http o ftp en el Tivo y descargar de estos
Intenta usar la biblioteca jsoup.
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class ParseHTML {
public static void main(String args[]) throws IOException{
Document doc = Jsoup.connect("https://www.wikipedia.org/").get();
String text = doc.body().text();
System.out.print(text);
}
}
Puede descargar la biblioteca jsoup aquí .