以Groovy的方式更稳定地解析HTML
来源:互联网 发布:淘宝嘉年华和双11 编辑:程序博客网 时间:2024/05/01 07:14
如何使用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 更迅速地对 Java 代码进行单元测试
- 洪小文:以科学的方式赤裸裸地剖析人工智能
- github以网页的方式查看.html
- 以一种更自然的方式去思考
- 你所谓的“稳定” 只是稳定地穷着~
- 对别人的恶意你是否可以更有智能地以善意回应呢?
- 全新的Microsoft Office 2016发布,以更少步骤更快地执行工作
- 哪种技术的工作更稳定?
- BEM命名方式,书写更优质的HTML
- 三层实木复合地板:更舒适、更稳定的选择
- 以流的方式在html页面上显示图片
- github以网页的方式查看.html文件
- 洪小文:以科学的方式赤裸裸地剖析AI(三)| 人的智慧在哪里?
- (转)洪小文:以科学的方式赤裸裸地剖析AI|混沌初开
- 洪小文:以科学的方式赤裸裸地剖析人工智能 | 混沌初开
- 洪小文:以科学的方式赤裸裸地剖析AI(二)|从寒冬到复兴
- 洪小文:以科学的方式赤裸裸地剖析AI(二)|从寒冬到复兴
- JMS Apache ActiveMQ使用(3)
- JSON与XML的比较
- 说说static lib ,dynamic lib,dll
- linux pwm实现蜂鸣器
- 替换Java字符串中的“& lt;”为“<”
- 以Groovy的方式更稳定地解析HTML
- netlink
- CSDN资源积分怎么获得?
- 排列的分解
- 用C#编写网络电话
- 用大根堆实现大值优先队列
- Java第一个程序的第一个错误
- 解析String类型的XML
- OD隐藏