2008-09-19 17 views
14

Quiero analizar una página web en Groovy y extraer todos los enlaces href y el texto asociado con ella.¿Cómo se analiza una página web y se extraen todos los enlaces href?

Si la página contenían estos enlaces:

<a href="http://www.google.com">Google</a><br /> 
<a href="http://www.apple.com">Apple</a> 

la salida sería:

Google, http://www.google.com<br /> 
Apple, http://www.apple.com 

estoy en busca de una respuesta maravillosa. AKA. ¡La manera fácil!

Respuesta

17

Suponiendo bien formada XHTML, sorber el xml, debería reunir todas las etiquetas, encontrar la 'A' etiquetas, e imprimir el href y texto.

input = """<html><body> 
<a href = "http://www.hjsoft.com/">John</a> 
<a href = "http://www.google.com/">Google</a> 
<a href = "http://www.stackoverflow.com/">StackOverflow</a> 
</body></html>""" 

doc = new XmlSlurper().parseText(input) 
doc.depthFirst().collect { it }.findAll { it.name() == "a" }.each { 
    println "${it.text()}, ${[email protected]()}" 
} 
+1

Este enfoque no funcionará muy bien por una razón simple pero verdadera: por lo general, el sitio web no tiene un XML bien formado. Funcionará en algunos casos, pero no en todos. – MeIr

+1

Aquí hay un buen enlace: http://blog.stannard.net.au/2010/05/12/parsing-html-with-groovy-and-htmlcleaner/ – MeIr

4

Una búsqueda rápida en Google encontró una buena posibilidad, TagSoup.

+0

Este sitio proporciona un ejemplo completo con TagSoup que funciona. http://www.cyblex.at/blog/?p=83 Tuve que cambiar algunas de las comillas ('y ") para que se ejecutara pero este ejemplo es excelente. El autor descarga todas las * .mp4 files. –

0

Pruebe una expresión regular. Algo como esto debería funcionar:

(html =~ /<a.*href='(.*?)'.*>(.*?)<\/a>/).each { url, text -> 
    // do something with url and text 
} 

Tome un vistazo a Groovy - Tutorial 4 - Regular expressions basics y Anchor Tag Regular Expression Breaking.

+4

Las expresiones regulares también curan el cáncer – wfarr

+0

... a costa de una posible posesión demoníaca http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html – harschware

1

Utilice XMLSlurper para analizar el HTML como un documento XML y luego use el método find con un cierre apropiado para seleccionar las etiquetas a y luego use el método de lista en GPathResult para obtener una lista de las etiquetas. Debería poder extraer el texto como secundarios de GPathResult.

2

No conozco Java pero creo que xpath es mucho mejor que las expresiones regulares clásicas para obtener uno (o más) elementos html.

También es más fácil escribir y leer.

<html> 
    <body> 
     <a href="1.html">1</a> 
     <a href="2.html">2</a> 
     <a href="3.html">3</a> 
    </body> 
</html> 

Con el HTML anterior, esta expresión "/ html/cuerpo/a", aparecerá una lista de todos los elementos href.

Aquí es un buen tutorial paso a paso http://www.zvon.org/xxl/XPathTutorial/General/examples.html

-2

HTML analizador + expresiones regulares Cualquier lenguaje lo harían, aunque yo diría que Perl es la solución más rápida.

0

El análisis usando XMlSlurper solo funciona si HTMl está bien formado.

Si su página HTMl tiene etiquetas no bien formadas, utilice regex para analizar la página.

Ex: <a href="www.google.com">

aquí, 'a' no está cerrado y por lo tanto no está bien formada.

new URL(url).eachLine{ 
    (it =~ /.*<A HREF="(.*?)">/).each{ 
     // process hrefs 
    } 
} 
Cuestiones relacionadas