zoukankan      html  css  js  c++  java
  • 以Groovy的方式更稳定地解析HTML(转载)

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

    原文:Robust HTML parsing the Groovy way

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

    主要的阻碍来自于:

    1. DTD
    2. 未闭合的标签

    让我们通过一个简单的脚本来演示解析 StackOverflow 的页面

    [java] view plaincopy
     
    1. def slurper = new XmlSlurper()  
    2. def htmlParser = slurper.parse("http://stackoverflow.com/")  
    3.    
    4. htmlParser.'**'.findAll{ it.@class == 'question-hyperlink'}.each {  
    5.     println it  
    6. }  

    脚本访问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
     
    1. def slurper = new XmlSlurper()  
    2. slurper.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd"false)  
    3. def htmlParser = slurper.parse("http://stackoverflow.com/")  
    4.   
    5. htmlParser.'**'.findAll{ it.@class == 'question-hyperlink'}.each {  
    6.     println it  
    7. }  

    但是由于存在未闭合的标签,脚本再次报错。这里 TagSoup 登场来解决此问题。最棒的是,tagsoup 和 XmlSlurper 能够非常好的配合,以下为示范 

    [java] view plaincopy
     
    1. @Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='1.2' )  
    2. def tagsoupParser = new org.ccil.cowan.tagsoup.Parser()  
    3. def slurper = new XmlSlurper(tagsoupParser)  
    4. def htmlParser = slurper.parse("http://stackoverflow.com/")  
    5. htmlParser.'**'.findAll{ it.@class == 'question-hyperlink'}.each {  
    6.     println it  
    7. }  

    首行用来获取tagsoup的库,此后将tagsoupParser的实例赋给XmlSlurper即可。

    本文转载自 http://blog.csdn.net/hiarcs/article/details/6628062

  • 相关阅读:
    N46期第一周作业
    备份MBR分区表,并破坏后修复
    预习作业(五)作业
    预习作业(四)作业
    通过v$sqlarea,v$sql查询最占用资源的查询
    ORACLE快速彻底Kill掉的会话
    HTML5中修改表单验证默认提示语句
    input正则 常用正则(备用)
    使用扫描枪扫描条码时字符识别写入缓慢问题(针对element-ui的el-input)优化
    JQuery经验汇总
  • 原文地址:https://www.cnblogs.com/chenying99/p/3080180.html
Copyright © 2011-2022 走看看