Como você analisa uma página da web e extrai todos os links href?
Pergunta
Quero analisar uma página da web no Groovy e extrair todos os links href e o texto associado a ela.
Se a página contivesse estes links:
<a href="http://www.google.com">Google</a><br />
<a href="http://www.apple.com">Apple</a>
a saída seria:
Google, http://www.google.com<br />
Apple, http://www.apple.com
Estou procurando uma resposta Groovy.Também conhecido como.O caminho fácil!
Solução
Assumindo bem formado XHTML, sorver o xml, recolher todas as tags, encontrar o 'A' tags, e imprimir a href e 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()}, ${it.@href.text()}"
}
Outras dicas
Um rápido Google Search apareceu uma boa aparência possibilidade, TagSoup .
Eu não sei java, mas eu acho que xpath é muito melhor do que expressões regulares clássicos a fim de obter um (ou mais) html elementos.
É também mais fácil de escrever e de ler.
<html>
<body>
<a href="1.html">1</a>
<a href="2.html">2</a>
<a href="3.html">3</a>
</body>
</html>
Com o HTML acima, esta expressão "/ html / corpo / a" irá listar todos os elementos href.
Aqui está um bom tutorial passo a passo http: //www.zvon. org / XXL / XPathTutorial / general / examples.html
Use XmlSlurper para analisar o HTML como um documento XML e, em seguida, usar o método find com um fechamento apropriado para selecionar os de tags e, em seguida, usar o método lista GPathResult para obter uma lista das tags. Você deve então ser capaz de extrair o texto como filhos do GPathResult.
Tente uma expressão regular. Algo como isto deve funcionar:
(html =~ /<a.*href='(.*?)'.*>(.*?)<\/a>/).each { url, text ->
// do something with url and text
}
Dê uma olhada Groovy - Tutorial 4 - expressões regulares básico e Tag Anchor expressões regulares Quebrando .
A análise usando XMlSlurper só funciona se o HTMl estiver bem formado.
Se sua página HTML tiver tags não bem formadas, use regex para analisar a página.
Ex: <a href="www.google.com">
aqui, 'a' não está fechado e, portanto, não está bem formado.
new URL(url).eachLine{
(it =~ /.*<A HREF="(.*?)">/).each{
// process hrefs
}
}
Html analisador + expressões regulares Qualquer língua iria fazê-lo, embora eu diria que Perl é a solução mais rápida.