Как вы анализируете веб-страницу и извлекаете все ссылки href? - PullRequest
15 голосов
/ 19 сентября 2008

Я хочу проанализировать веб-страницу в 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 ]

17 голосов
/ 02 октября 2008

Предполагая, что XHTML правильно сформирован, выплескивает XML, собирает все теги, находит теги 'a' и распечатывает ссылки и текст.

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()}"
}
4 голосов
/ 19 сентября 2008

Быстрый поиск в Google показал прекрасную возможность, TagSoup .

2 голосов
/ 19 сентября 2008

Я не знаю 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

1 голос
/ 19 сентября 2008

Используйте XMLSlurper для анализа HTML как документа XML, а затем используйте метод find с соответствующим закрытием для выбора тегов a, а затем используйте метод list в GPathResult для получения списка тегов. После этого вы сможете извлечь текст как дочерние элементы GPathResult.

0 голосов
/ 05 апреля 2012

Синтаксический анализ с использованием XMlSlurper работает, только если HTMl правильно сформирован.

Если ваша страница HTMl имеет неправильно сформированные теги, используйте регулярное выражение для анализа страницы.

Пример: <a href="www.google.com">

здесь «а» не является замкнутым и, следовательно, плохо сформированным.

 new URL(url).eachLine{
   (it =~ /.*<A HREF="(.*?)">/).each{
       // process hrefs
   }
}
0 голосов
/ 02 октября 2008

HTML-парсер + Регулярные выражения Любой язык сделает это, хотя я бы сказал, что Perl - самое быстрое решение.

0 голосов
/ 19 сентября 2008

Попробуйте регулярное выражение. Примерно так должно работать:

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

Взгляните на Groovy - Урок 4 - Основы регулярных выражений и Привязка тега привязки к регулярному выражению .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...