Groovy XML-разбор (HTML slurping), не могу заставить мой конкретный случай работать - PullRequest
0 голосов
/ 22 февраля 2012

Хорошо, вот что я ищу.

Я хочу зайти в DOM и найти <a id>, начинающийся с "thread_title_". Вот пара вещей, которые я пробовал:

// setup
def slurper = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser())
def gurl = new URL("url")
gurl.withReader { gReader ->

  def try1 = gHTML.body.find { it['@id'].startsWith("thread_title_") }
  // fails: Caught: groovy.lang.MissingMethodException: No signature of method: groovy.util.slurpersupport.Attributes.startsWith() is applicable for argument types: (java.lang.String) values: [thread_title_]

  def try2 = gHTML.body.find { it['@id'] =~ /thread_title_/ }
  // fails: Caught: groovy.lang.MissingMethodException: No signature of method: groovy.util.slurpersupport.Attributes.startsWith() is applicable for argument types: (java.lang.String) values: [thread_title_]

  def try3 = gHTML.body.find { it['@id'].name.startsWith("thread_title_") }
  // fails: Caught: groovy.lang.MissingMethodException: No signature of method: groovy.util.slurpersupport.NodeChildren.startsWith() is applicable for argument types: (java.lang.String) values: [thread_title_]

  def try4 = gHTML.body.find { it['@id'] == 'thread_title_745429' }
  // doesn't fail, but doesn't return anything either

  def try5 = gHTML.body.findAll { it.name() == 'a' && it.@id.startsWith('thread_title_') }
  try5.eachWithIndex { row, i ->
    println "rn: $i"
  }
  // no output

}

Здесь - это gdoc для атрибутов. Я действительно не хочу "имя", я хочу "значение". Страница gpath подразумевает, что node.character.find { it['@id'] == '2' } работает, что очень похоже на находку ... начинается с меня. Этот ответ на переполнение стека похож, но старты с другими и, кажется, бросают гаечный ключ в целом. Пятая запись была , вдохновленная этим ответом на стек * * * * * * * *

И если вас это беспокоит, это проблема с входными данными: $ curl --silent

http://www.advrider.com/forums/forumdisplay.php?f=18 | grep thread_title | туалет 43

Вот пример выходных данных с использованием curl | grep выше.

<a href="foo" id="thread_title_705760">text</a>
<a href="foo" id="thread_title_753701">text</a>

У меня установлен Groovy 1.7.10. Я мог бы пойти по-новому, не знаю, поможет ли это.

1 Ответ

2 голосов
/ 22 февраля 2012

Как это?

@Grab( 'org.ccil.cowan.tagsoup:tagsoup:1.2.1' )
import org.ccil.cowan.tagsoup.Parser

def gHTML = new URL( 'http://www.advrider.com/forums/forumdisplay.php?f=18' ).withReader { r ->
  new XmlSlurper( new Parser() ).parse( r )
}

def allLinks = gHTML.body.'**'.findAll { it.name() == 'a' && it.@id.text().startsWith( 'thread_title_' ) }
allLinks.each { link ->
  println "${link.text()} -> ${link.@href}"
}

Дайте мне знать, если у вас есть проблемы или вопросы: -)

...