我已经使用此代码一段时间了,我不确定自己做错了什么。
我得到一个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 }
}
你有没有试着看看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 }
}
您也可以使用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' && it.@type?.toString() == 'hidden' }
els.each {
println "${it.@name}=${it.@value}"
}
}
response.failure = { resp -> println resp.statusLine }
}