以Groovy的方式更稳定地解析HTML(转载)
2013-05-15 17:05
169 查看
如何使用Groovy解析无法通过XML验证的HTML代码
原文:Robust HTML parsing the Groovy way
用Groovy解析XML很简单,只要确保输入的数据格式良好就能运行的很好——但现实并非总是能保证这一点。视考虑HTML代码,想让它们通过XML的验证总是困难重重,这就需要 TagSoup 来拯救了。
主要的阻碍来自于:
DTD
未闭合的标签
让我们通过一个简单的脚本来演示解析 StackOverflow 的页面
[java] view plaincopy
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时遇到问题,通过另一博客中的方法可以解决。
[java] view plaincopy
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 能够非常好的配合,以下为示范
[java] view plaincopy
@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即可。
本文转载自 http://blog.csdn.net/hiarcs/article/details/6628062
原文:Robust HTML parsing the Groovy way
用Groovy解析XML很简单,只要确保输入的数据格式良好就能运行的很好——但现实并非总是能保证这一点。视考虑HTML代码,想让它们通过XML的验证总是困难重重,这就需要 TagSoup 来拯救了。
主要的阻碍来自于:
DTD
未闭合的标签
让我们通过一个简单的脚本来演示解析 StackOverflow 的页面
[java] view plaincopy
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时遇到问题,通过另一博客中的方法可以解决。
[java] view plaincopy
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 能够非常好的配合,以下为示范
[java] view plaincopy
@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即可。
本文转载自 http://blog.csdn.net/hiarcs/article/details/6628062
相关文章推荐
- 以Groovy的方式更稳定地解析HTML
- html解析利器Html Tidy-附示例与交叉编译方式
- 内存中html源码用IHTMLDocument2进行DOM方式解析
- WCF生成客户端对象方式解析-转载lonet
- (转载)Python写爬虫--抓取网页并解析HTML
- 【转载】GDI 映像方式 之 SetViewportOrgEx 与 SetWindowOrgEx 解析
- Ajax解析html、xml、json、js原生方式、jquery方式
- android解析XML总结(SAX、Pull、Dom三种方式) <转载>
- Android 服务端返回的数据含有html字段时的解析方式
- 【转载】GDI 映像方式 之 SetViewportExtEx 与 SetWindowExtEx 解析
- HTML解析原理概括(转载)
- HtmlParser 解析HTML[转载]
- 【转载】使用Jsoup解析html网页
- (转载)使用 jsoup 对 HTML 文档进行解析和操作
- 变体记录及存储方式(转载自 http://www.cnblogs.com/okwary/articles/1364018.html)
- MyEclipse设置编码方式 转载【http://www.cnblogs.com/susuyu/archive/2012/06/27/2566062.html】
- HTML解析原理概括(转载)
- 变体记录及存储方式(转载自 http://www.cnblogs.com/okwary/articles/1364018.html)
- Android实现推送方式解决方案【转载地址:http://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378971.html】
- (转载)iOS解析html