以Groovy的方式更稳定地解析HTML

以Groovy的方式更稳定地解析HTML,第1张

概述如何使用Groovy解析无法通过XML验证的HTML代码 原文:Robust HTML parsing the Groovy way 用Groovy解析XML很简单,只要确保输入的数据格式良好就能运行的很好——但现实并非总是能保证这一点。视考虑HTML代码,想让它们通过XML的验证总是困难重重,这就需要 TagSoup 来拯救了。 主要的阻碍来自于: DTD 未闭合的标签 让我们通过一个简单的脚本

如何使用Groovy解析无法通过XML验证的HTML代码

原文:Robust HTML parsing the Groovy way

用Groovy解析XML很简单,只要确保输入的数据格式良好就能运行的很好——但现实并非总是能保证这一点。视考虑HTML代码,想让它们通过XML的验证总是困难重重,这就需要 TagSoup 来拯救了。

主要的阻碍来自于:

DTD 未闭合的标签

让我们通过一个简单的脚本来演示解析 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即可。 总结

以上是内存溢出为你收集整理的以Groovy的方式更稳定地解析HTML全部内容,希望文章能够帮你解决以Groovy的方式更稳定地解析HTML所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1269543.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存