Парсинг DOM вернулся из JTidy, чтобы найти определенный элемент HTML - PullRequest
3 голосов
/ 05 марта 2012

Я играл с этим кодом некоторое время, и я не уверен, что делаю неправильно.

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

У меня есть распечатка всей 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 }
    }

Ответы [ 2 ]

5 голосов
/ 06 марта 2012

Вы пытались взглянуть на 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 = '/7212236/parsing-dom-vernulsya-iz-jtidy-chtoby-naiti-opredelennyi-element-html'

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 }
}
2 голосов
/ 06 марта 2012

Вы также можете использовать 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 = '/7212236/parsing-dom-vernulsya-iz-jtidy-chtoby-naiti-opredelennyi-element-html'

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 }
}
...