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

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

原文:Robust HTML parsing the Groovy way

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

主要的阻碍来自于:

  1. DTD
  2. 未闭合的标签

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值