2010-06-04 17 views
24

Necesito extraer información de una página web no estructurada en Android. La información que quiero está incrustada en una tabla que no tiene una identificación.¿Cuál es la forma más rápida de eliminar páginas web HTML en Android?

<table> 
<tr><td>Description</td><td></td><td>I want this field next to the description cell</td></tr> 
</table> 

¿Debo usar

  • Pattern Matching?
  • Utilice BufferedReader para extraer la información?

¿O hay forma más rápida de obtener esa información?

+0

No debe analizar HTML con expresiones regulares: http://blog.codinghorror.com/parsing-html -the-cthulhu-way/ –

Respuesta

45

Creo que en este caso no tiene sentido para buscar una información rápida manera de extracto de que no existe prácticamente ninguna diferencia de rendimiento entre los métodos que han sido sugeridas en las respuestas cuando se compara con el tiempo que se llevar a descargar el HTML.

Así que asumiendo que por más rápido quiere decir más conveniente, fácil de leer y código mantenible, le sugiero que utilice un DocumentBuilder para analizar los datos HTML y extraer relevantes mediante XPathExpression s:

Document doc = DocumentBuilderFactory.newInstance() 
    .newDocumentBuilder().parse(new InputSource(new StringReader(html))); 

XPathExpression xpath = XPathFactory.newInstance() 
    .newXPath().compile("//td[text()=\"Description\"]/following-sibling::td[2]"); 

String result = (String) xpath.evaluate(doc, XPathConstants.STRING); 

Si por casualidad recuperar HTML no válido, recomiendo aislar la parte relevante (por ejemplo, usando substring(indexOf("<table")..) y, si es necesario, corregir los errores HTML restantes con String operaciones antes del análisis. Sin embargo, si esto se vuelve demasiado complejo (es decir, HTML muy malo), siga el enfoque de combinación de patrones hacky como se sugiere en otras respuestas.

Observaciones

  • XPath está disponible desde el API de nivel 8 (Android 2.2). Si desarrolla niveles inferiores de API, puede usar métodos DOM y condicionales para navegar al nodo que desea extraer
0

¿Por qué no crea una secuencia de comandos que hace el raspado con cURL y simple html dom parser y simplemente toma el valor que necesita de esa página? Estas herramientas funcionan con PHP, pero existen otras herramientas para existir para cualquier idioma que necesite.

0

Una forma de hacer esto es poner el html en una Cadena y luego buscar y analizar manualmente a través de la Cadena. Si sabe que las etiquetas vendrán en un orden específico, entonces debería poder rastrearlo y encontrar los datos. Sin embargo, esto es un poco descuidado, por lo que es una cuestión de ¿quieres que funcione ahora? o trabajo bien?

int position = (String)html.indexOf("<table>"); //html being the String holding the html code 
String field = html.substring(html.indexOf("<td>",html.indexOf("<td>",position)) + 4, html.indexOf("</td>",html.indexOf("</td>",position))); 

como dije ... realmente descuidado. Pero si solo haces esto una vez y necesitas que funcione, esto podría funcionar.

1

¿Por qué no acaba de escribir

inicio int = data.indexOf ("Descripción");

Después de eso, tome la subcadena requerida.

17

manera más rápida será analizar la información específica usted mismo. Parece que sabes la estructura HTML precisamente de antemano. Los métodos BufferedReader, String y StringBuilder deberían ser suficientes. He aquí un ejemplo puntapié inicial que muestra el primer párrafo de su propia pregunta:

public static void main(String... args) throws Exception { 
    URL url = new URL("http://stackoverflow.com/questions/2971155"); 
    BufferedReader reader = null; 
    StringBuilder builder = new StringBuilder(); 
    try { 
     reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); 
     for (String line; (line = reader.readLine()) != null;) { 
      builder.append(line.trim()); 
     } 
    } finally { 
     if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} 
    } 

    String start = "<div class=\"post-text\"><p>"; 
    String end = "</p>"; 
    String part = builder.substring(builder.indexOf(start) + start.length()); 
    String question = part.substring(0, part.indexOf(end)); 
    System.out.println(question); 
} 

de análisis se encuentra en prácticamente todos los casos, sin duda más rápido que la coincidencia de patrones. La coincidencia de patrones es más fácil, pero existe un cierto riesgo de que arroje resultados inesperados, sin duda cuando se utilizan patrones de expresiones regulares complejos.

También puede considerar utilizar un analizador HTML de terceros más flexible en lugar de escribir uno usted mismo. No será tan rápido como analizarse con información conocida de antemano. Sin embargo, será más conciso y flexible. Con analizadores de HTML decentes, la diferencia de velocidad es bastante insignificante. Recomiendo encarecidamente Jsoup para esto. Es compatible con jQuery-like CSS selectors. La extracción del párrafo firsrt de su pregunta sería entonces tan fácil como:

public static void main(String... args) throws Exception { 
    Document document = Jsoup.connect("http://stackoverflow.com/questions/2971155").get(); 
    String question = document.select("#question .post-text p").first().text(); 
    System.out.println(question); 
} 

No está claro qué página Web que está hablando, por lo que no puede dar un ejemplo más detallado cómo se puede seleccionar la información específica de la página específica usando Jsoup. Si todavía no puede resolverlo usando Jsoup y CSS selectors, siéntase libre de publicar la URL en un comentario y sugeriré cómo hacerlo.

+0

jsoup tiene una dependencia en la biblioteca de Apache Commons Lang –

+0

@Josef: No veo cómo es una razón válida para el downvote. – BalusC

+2

jsoup es autónomo ahora. Ver http://jsoup.org/download – gregm

1

Cuando deseche la página web Html. Dos cosas que puedes hacer por eso. First One está usando REGEX. Otro es analizadores Html.

El uso de Regex no es preferible por todos. Porque causa una excepción lógica en el tiempo de ejecución.

El uso del analizador Html es más complicado de hacer. no puede estar seguro de que llegará la salida adecuada. también se hizo una excepción de tiempo de ejecución por mi experiencia.

Así que es mejor responder el archivo url a Xml. y do xml parsing es muy fácil y efectivo.

Cuestiones relacionadas