Domanda

Voglio analizzare una pagina web in Groovy ed estrarre tutti i collegamenti href e il testo associato ad essa.

Se la pagina conteneva questi collegamenti:

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

l'output sarebbe:

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

Sto cercando una risposta Groovy.AKA.Il modo più semplice!

È stato utile?

Soluzione

Supponendo che XHTML sia ben formato, bevi l'xml, raccogli tutti i tag, trova i tag "a" e stampa l'href e il testo.

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()}, ${it.@href.text()}"
}

Altri suggerimenti

Una rapida ricerca su Google ha rivelato una possibilità interessante, TagZuppa.

Non conosco Java ma penso che xpath sia molto meglio delle classiche espressioni regolari per ottenere uno (o più) elementi html.

È anche più facile da scrivere e da leggere.

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

Con l'html sopra, questa espressione "/html/body/a" elencherà tutti gli elementi href.

Ecco un buon tutorial passo passo http://www.zvon.org/xxl/XPathTutorial/General/examples.html

Utilizza XMLSlurper per analizzare l'HTML come documento XML, quindi utilizza il metodo find con una chiusura appropriata per selezionare i tag a e quindi utilizza il metodo list su GPathResult per ottenere un elenco dei tag.Dovresti quindi essere in grado di estrarre il testo come figlio di GPathResult.

Prova un'espressione regolare.Qualcosa del genere dovrebbe funzionare:

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

Dare un'occhiata a Groovy - Tutorial 4 - Nozioni di base sulle espressioni regolari E Rottura dell'espressione regolare del tag di ancoraggio.

L'analisi utilizzando XMlSlurper funziona solo se HTMl è ben formato.

Se la tua pagina HTML ha tag non ben formati, utilizza regex per analizzare la pagina.

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

qui "a" non è chiusa e quindi non è ben formata.

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

Parser HTML + espressioni regolari Qualsiasi lingua lo farebbe, anche se direi che Perl è la soluzione più veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top