【问题标题】:Parsing DOM returned from JTidy to find a particular HTML element解析从 JTidy 返回的 DOM 以查找特定的 HTML 元素
【发布时间】:2012-03-23 07:02:32
【问题描述】:

我一直在玩这段代码,但我不确定我做错了什么。

我得到一个 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 }
    }

【问题讨论】:

    标签: dom groovy html-parsing jtidy


    【解决方案1】:

    您是否尝试过查看 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 }
    }
    

    【讨论】:

      【解决方案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' && it.@type?.toString() == 'hidden' }
              els.each {
                  println "${it.@name}=${it.@value}"
              }
          }
          response.failure = { resp -> println resp.statusLine }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-09-09
        • 1970-01-01
        • 1970-01-01
        • 2013-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-17
        相关资源
        最近更新 更多