以Groovy的方式更稳定地解析HTML
发布时间:2020-12-14 17:02:54 所属栏目:大数据 来源:网络整理
导读:如何使用Groovy解析无法通过XML验证的HTML代码 原文:Robust HTML parsing the Groovy way 用Groovy解析XML很简单,只要确保输入的数据格式良好就能运行的很好——但现实并非总是能保证这一点。视考虑HTML代码,想让它们通过XML的验证总是困难重重,这就需要
如何使用Groovy解析无法通过XML验证的HTML代码 原文:Robust HTML parsing the Groovy way 用Groovy解析XML很简单,只要确保输入的数据格式良好就能运行的很好——但现实并非总是能保证这一点。视考虑HTML代码,想让它们通过XML的验证总是困难重重,这就需要 TagSoup?来拯救了。 主要的阻碍来自于:
让我们通过一个简单的脚本来演示解析?StackOverflow 的页面 def slurper = new XmlSlurper() def htmlParser = slurper.parse("http://stackoverflow.com/") htmlParser.'**'.findAll{ it.@class == 'question-hyperlink'}.each { println it }脚本访问stack overflow的主页并打印所有带有'question-hyperlink'属性的项。但运行时抛出如下异常:Caught: java.io.IOException: Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/html4/strict.dtd at html_parser.run(html_parser.groovy:7) 译注:这一问题在升级到 Groovy 1.8 后已经不复存在 XmlSlurper在解析HTML DTD时遇到问题,通过另一博客中的方法可以解决。 def slurper = new XmlSlurper() slurper.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false) def htmlParser = slurper.parse("http://stackoverflow.com/") htmlParser.'**'.findAll{ it.@class == 'question-hyperlink'}.each { println it } 但是由于存在未闭合的标签,脚本再次报错。这里 TagSoup 登场来解决此问题。最棒的是,tagsoup 和 XmlSlurper 能够非常好的配合,以下为示范? @Grab(group='org.ccil.cowan.tagsoup',module='tagsoup',version='1.2' ) def tagsoupParser = new org.ccil.cowan.tagsoup.Parser() def slurper = new XmlSlurper(tagsoupParser) def htmlParser = slurper.parse("http://stackoverflow.com/") htmlParser.'**'.findAll{ it.@class == 'question-hyperlink'}.each { println it }首行用来获取tagsoup的库,此后将tagsoupParser的实例赋给XmlSlurper即可。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |