2012-03-05 2 views
2

Я играл с этим кодом некоторое время, и я не уверен, что я делаю неправильно.Parsing DOM вернулся из JTidy, чтобы найти определенный элемент HTML

Я получаю URL-адрес, очищаю его с помощью JTidy, так как он не является корректным, тогда мне нужно найти конкретное скрытое поле ввода (input type="hidden" name="mytarget" value="313"), поэтому я знаю значение в атрибуте name.

У меня есть распечатка всей страницы html, когда она очищает ее, поэтому я могу сравнить то, что я ищу, с тем, что находится в документе.

Моя проблема заключается в том, чтобы определить лучший способ найти это, где у меня есть System.out << it.

def http = new HTTPBuilder(url) 
    http.request(GET,TEXT) { req -> 
     response.success = { resp, reader -> 
      assert resp.status == 200 
      def tidy = new Tidy() 
      def node = tidy.parse(reader, System.out) 
      def doc = tidy.parseDOM(reader, null).documentElement 
      def nodes = node.last.last 
      nodes.each{System.out << it} 
     } 
     response.failure = { resp -> println resp.statusLine } 
    } 

ответ

4

Вы пробовали взглянуть на JSoup вместо JTidy? Я не уверен, насколько хорошо он обрабатывает искаженный HTML-контент, но я успешно использовал его при анализе HTML-страницы и поиске элемента, который мне нужен, с помощью селекторов стиля JQuery. Это намного проще, чем перемещение DOM вручную, если вы не знаете точное расположение DOM.

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.2') 
@Grab(group='org.jsoup', module='jsoup', version='1.6.1') 

import groovyx.net.http.HTTPBuilder 
import static groovyx.net.http.Method.GET 
import static groovyx.net.http.ContentType.TEXT 
import org.jsoup.Jsoup 

def url = 'http://stackoverflow.com/questions/9572891/parsing-dom-returned-from-jtidy-to-find-a-particular-html-element' 

new HTTPBuilder(url).request(GET, TEXT) { req -> 
    response.success = { resp, reader -> 
     assert resp.status == 200 
     def doc = Jsoup.parse(reader.text) 
     def els = doc.select('input[type=hidden]') 
     els.each { 
      println it.attr('name') + '=' + it.attr('value') 
     } 
    } 
    response.failure = { resp -> println resp.statusLine } 
} 
+0

Я проверить это, спасибо. –

2

Вы также можете использовать nekohtml:

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.2') 
@Grab(group='net.sourceforge.nekohtml', module='nekohtml', version='1.9.15') 

import groovyx.net.http.HTTPBuilder 
import static groovyx.net.http.Method.GET 
import static groovyx.net.http.ContentType.TEXT 
import org.cyberneko.html.parsers.SAXParser 

def url = 'http://stackoverflow.com/questions/9572891/parsing-dom-returned-from-jtidy-to-find-a-particular-html-element' 

new HTTPBuilder(url).request(GET, TEXT) { req -> 
    response.success = { resp, reader -> 
     assert resp.status == 200 
     def doc = new XmlSlurper(new SAXParser()).parseText(reader.text) 
     def els = doc.depthFirst().grep { it.name() == 'INPUT' && [email protected]?.toString() == 'hidden' } 
     els.each { 
      println "${[email protected]}=${[email protected]}" 
     } 
    } 
    response.failure = { resp -> println resp.statusLine } 
} 
Смежные вопросы