Как вы анализируете веб-страницу и извлекаете все ссылки href?
Я хочу проанализировать веб-страницу в Groovy и извлечь из нее все ссылки href и связанный с ними текст.
Если страница содержала эти ссылки:
<a href="http://www.google.com">Google</a><br />
<a href="http://www.apple.com">Apple</a>
результат будет:
Google, http://www.google.com<br />
Apple, http://www.apple.com
Я ищу Groovy ответ. AKA. Простой способ!
7 ответов
Предполагая, что XHTML правильно сформирован, выложите xml, соберите все теги, найдите теги "a" и распечатайте href и текст.
input = """<html><body>
<a href = "http://www.hjsoft.com/">John</a>
<a href = "http://www.google.com/">Google</a>
<a href = "http://www.stackru.com/">Stackru</a>
</body></html>"""
doc = new XmlSlurper().parseText(input)
doc.depthFirst().collect { it }.findAll { it.name() == "a" }.each {
println "${it.text()}, ${it.@href.text()}"
}
Я не знаю Java, но я думаю, что xpath намного лучше, чем классические регулярные выражения, чтобы получить один (или более) HTML-элементов.
Это также легче писать и читать.
<html>
<body>
<a href="1.html">1</a>
<a href="2.html">2</a>
<a href="3.html">3</a>
</body>
</html>
С помощью HTML выше, это выражение "/ html / body / a" будет перечислять все элементы href.
Вот хороший пошаговый учебник http://www.zvon.org/xxl/XPathTutorial/General/examples.html
Используйте XMLSlurper для анализа HTML как документа XML, а затем используйте метод find с соответствующим закрытием, чтобы выбрать теги, а затем используйте метод list в GPathResult, чтобы получить список тегов. После этого вы сможете извлечь текст как дочерние элементы GPathResult.
Разбор с использованием XMlSlurper работает, только если HTMl правильно сформирован.
Если ваша страница HTMl имеет неправильно сформированные теги, используйте регулярное выражение для анализа страницы.
Пример: <a href="www.google.com">
здесь "а" не является замкнутым и, следовательно, не очень хорошо сформированным
new URL(url).eachLine{
(it =~ /.*<A HREF="(.*?)">/).each{
// process hrefs
}
}
Попробуйте регулярное выражение. Примерно так должно работать:
(html =~ /<a.*href='(.*?)'.*>(.*?)<\/a>/).each { url, text ->
// do something with url and text
}
Взгляните на Groovy - Урок 4 - Основы регулярных выражений и Разрыв регулярных выражений в привязке тегов.
Html parser + Регулярные выражения. Любой язык сделает это, хотя я бы сказал, что Perl - самое быстрое решение.