2010-02-18 17 views
5

Estoy usando el analizador HTML para desarrollar una aplicación. El siguiente código no puede obtener el conjunto completo de etiquetas en la página. Hay algunas etiquetas que se pierden y los atributos y el cuerpo del texto también se pierden. me puede ayudar a explicar por qué sucede esto ..... o me sugieren otra manera ....Cómo usar el analizador HTML para obtener información completa sobre todas las etiquetas en la página HTML

URL url = new URL("..."); 
PrintWriter pw=new PrintWriter(new FileWriter("HTMLElements.txt")); 

URLConnection connection = url.openConnection(); 
InputStream is = connection.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(isr); 

HTMLEditorKit htmlKit = new HTMLEditorKit(); 
HTMLDocument htmlDoc = (HTMLDocument)htmlKit.createDefaultDocument(); 
HTMLEditorKit.Parser parser = new ParserDelegator(); 
HTMLEditorKit.ParserCallback callback = htmlDoc.getReader(0); 
parser.parse(br, callback, true); 

ElementIterator iterator = new ElementIterator(htmlDoc); 
Element element; 
    while ((element = iterator.next()) != null) 
    { 
    AttributeSet attributes = element.getAttributes(); 
    Enumeration e=attributes.getAttributeNames(); 

    pw.println("Element Name :"+element.getName()); 
    while(e.hasMoreElements()) 
    { 
     Object key=e.nextElement(); 
     Object val=attributes.getAttribute(key); 
     int startOffset = element.getStartOffset(); 
    int endOffset = element.getEndOffset(); 
    int length = endOffset - startOffset; 
    String text=htmlDoc.getText(startOffset, length); 

     pw.println("Key :"+key.toString()+" Value :"+val.toString()+"\r\n"+"Text :"+text+"\r\n"); 

    } 
    } 

}

+2

El problema es demasiado vago. Tome un sitio de ejemplo ('http: // google.com' tal vez?) Y por favor diga en detalle qué es exactamente lo que falta. – BalusC

+0

en realidad quiero extraer información como el nombre del producto, el precio, etc. de todos los productos enumerados en un sitio de compras en línea como amazon.com ¿Cómo debo hacerlo? –

Respuesta

0

Usted parece usar el HtmlDocument Swing. Puede que no sea la idea más inteligente de la historia. Creo que obtendrías mejores resultados al usar, por ejemplo, NekoHtml.

1

De acuerdo con los comentarios:

realidad quiero extraer información como nombre del producto, etc precio de todos los productos que figuran en un sitio de compras en línea como amazon.com Cómo debo hacerlo? ??

Paso 1: leer sus archivos robots. Generalmente se encuentra en la raíz del sitio, por ejemplo http://amazon.com/robots.txt. Si la URL a la que está intentando acceder está cubierta por un Disallow en un User-Agent de *, entonces pare aquí. Póngase en contacto con ellos, explíqueles en detalle lo que está tratando de hacer y pregúnteles por formas/alternativas/servicios web que pueden proporcionarle la información que necesita. Si está violando las leyes, puede arriesgarse a ser incluido en la lista negra del sitio y/o su ISP o algo peor. De lo contrario, continúe con el paso 2.

Paso 2: compruebe si el sitio en cuestión no tiene todavía un servicio web público disponible que sea mucho más fácil de usar que analizar una página HTML completa. Al usar un servicio web, obtendrá exactamente la información que está buscando en un formato conciso (JSON o XML) basado en un conjunto simple de parámetros. Mire a su alrededor o contáctese con ellos para obtener detalles sobre cualquier servicio web. Si no hay manera, continúe con el paso 3.

Paso 3: aprender cómo HTML/CSS/trabajo JS, aprender a trabajar con las herramientas WebDeveloper como Firebug, aprender a interpretar el código HTML/CSS/JS fuente que ver por clic derecho>Ver fuente de la página. Mi apuesta es que el sitio en cuestión usa JS/Ajax para cargar/completar la información que le gustaría recopilar. En ese caso, necesitarás usar un analizador HTML que sea capaz de analizar y ejecutar JS también (el que estás utilizando no lo hace). Este no será un trabajo fácil, así que no lo explicaré en detalle hasta que esté completamente claro lo que está tratando de lograr y si eso está permitido y si no hay servicios web más fáciles de usar disponible.

+0

Paso 1: Robots.txt lo permite. No es un problema. Paso 2: Intenté usar AWS para ese asunto, pero no proporciona una lista completa de toda la información que necesito. Pero la información se puede ver en la página web. Así que tengo que ir al paso 3 Paso 3: Ahora el problema es que necesito extraer el nombre del producto, el precio, las características. Esto se puede hacer si identifico manualmente el patrón de cómo se almacena esta información en la página web. Pero ahora quiero una forma que automatice este patrón encontrando o debería ser capaz de extraerlo sin que se haya proporcionado ningún patrón al programa. ¿Cómo debo hacerlo? Gracias –

9

Estoy haciendo esto de manera bastante confiable con HTML Parser, (a condición de que el documento HTML no cambie su estructura). Un servicio web con una API estable es mucho mejor, pero a veces simplemente no tenemos uno.

idea general:

primero tiene que saber en qué etiquetas (div, meta, span, etc) la información que desea se encuentra, y conocer los atributos para identificar esas etiquetas. Ejemplo:

<span class="price"> $7.95</span> 

si usted está buscando para este "precio", entonces usted está interesado en span etiquetas con class "precio".

HTML Parser tiene una funcionalidad de filtro por atributo.

filter = new HasAttributeFilter("class", "price"); 

al analizar el uso de un filtro, obtendrá una lista de Nodes que se puede hacer una operación instanceof en ellos para determinar si son del tipo que usted está interesado en, por span desea hacer algo como

if (node instanceof Span) // or any other supported element. 

Ver la lista de etiquetas compatibles here.

Un ejemplo con HTML Analizador para agarrar la etiqueta meta que tiene descripción sobre un sitio:

Etiqueta de muestra:

<meta name="description" content="Amazon.com: frankenstein: Books"/> 

Código:

import org.htmlparser.Node; 
import org.htmlparser.Parser; 
import org.htmlparser.util.NodeList; 
import org.htmlparser.util.ParserException; 
import org.htmlparser.filters.HasAttributeFilter; 
import org.htmlparser.tags.MetaTag; 

public class HTMLParserTest { 
    public static void main(String... args) { 
     Parser parser = new Parser(); 
     //<meta name="description" content="Some texte about the site." /> 
     HasAttributeFilter filter = new HasAttributeFilter("name", "description"); 
     try { 
      parser.setResource("http://www.youtube.com"); 
      NodeList list = parser.parse(filter); 
      Node node = list.elementAt(0); 

      if (node instanceof MetaTag) { 
       MetaTag meta = (MetaTag) node; 
       String description = meta.getAttribute("content"); 

       System.out.println(description); 
       // Prints: "YouTube is a place to discover, watch, upload and share videos." 
      } 

     } catch (ParserException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
0

etiqueta de Página de google- <title>Google</title> Estoy tratando de recuperar contenido de texto en la etiqueta del título. Pero no obtengo una salida. Muestra Build Successfull y arroja el resultado como "TITLE". Necesito una salida como "GOOGLE".

import org.htmlparser.Node; 
import org.htmlparser.Parser; 
import org.htmlparser.filters.HasAttributeFilter; 
import org.htmlparser.filters.IsEqualFilter; 
import org.htmlparser.tags.MetaTag; 
import org.htmlparser.tags.TitleTag; 
import org.htmlparser.util.NodeList; 
import org.htmlparser.util.ParserException; 
public class MM { 
public static void main(String[] args) { 
     Parser parser=new Parser(); 


     try 
     { 
      parser.setResource("http://www.google.com"); 
      TitleTag title=new TitleTag(); 
      String tagtext=title.getTitle(); 
      System.out.println(tagtext); 


     } 

     }catch (ParserException e) { 

     } 

    } 
} 
Cuestiones relacionadas