欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    正则表达式HTMLParser使用详解.ppt

    • 资源ID:78702646       资源大小:377.50KB        全文页数:80页
    • 资源格式: PPT        下载积分:11.9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要11.9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    正则表达式HTMLParser使用详解.ppt

    Java正则表达式入门正则表达式入门+HTMLParser使用使用详解详解一、一、Java正则表达式入门正则表达式入门 众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。自从jdk1.4推出包,就为我们提供了很好的JAVA正则表达式应用平台。说明说明转义符转义符af响铃符=x07换页符=x0C,换页符n响铃符=x07,换行(u000A)r回车符=x0D,回车(u000D)t制表符=x09,间隔(u0009)v垂直制表符=x0BeESC符=x1B,Escapex20使用两位十六进制表示形式,可与该编号的字符匹配u002B使用四位十六进制表示形式,可与该编号的字符匹配x20A060使用任意位十六进制表示形式,可与该编号的字符匹配说明说明字符字符$匹配输入字符串的开始位置。要匹配字符本身,请使用匹配输入字符串的结尾位置。要匹配“$”字符本身,请使用“$”()标记一个子表达式的开始和结束位置。要匹配小括号,请使用(和)用来自定义能够匹配多种字符的表达式。要匹配中括号,请使用和修饰匹配次数的符号。要匹配大括号,请使用和.匹配除了换行符(n)以外的任意一个字符。要匹配小数点本身,请使用.?修饰匹配次数为0次或1次。要匹配?字符本身,请使用?+修饰匹配次数为至少1次。要匹配+字符本身,请使用+*修饰匹配次数为0次或任意次。要匹配*字符本身,请使用*|左右两边表达式之间或关系。匹配|本身,请使用|说明说明字符集合字符集合.w小数点可以匹配除了换行符(n)以外的任意一个字符可以匹配任何一个字母或者数字或者下划线,单独字符a-zA-Z_0-9WW大写,可以匹配任何一个字母或者数字或者下划线以外的字符,非单独字符a-zA-Z_0-9s可以匹配空格、制表符、换页符等空白字符的其中任意一个,空白符号tnx0BfrSS大写,可以匹配任何一个空白字符以外的字符,非空白符号tnx0Bfrd可以匹配任何一个09数字字符,数字等价于0-9DD大写,可以匹配任何一个非数字字符,非数字等价于0-9字符集合字符集合可以匹配“多个字符”其中任意一个字符的正则表达式。虽然是“多个字符”,但每次只能匹配其中一个。DEELX正则表达式中标准的字符集合有:说明说明限定符限定符nm,n表达式固定重复n次,比如:w2相当于ww表达式尽可能重复n次,至少重复m次:ba1,3可以匹配ba或baa或baaam,表达式尽可能的多匹配,至少重复m次:“wd2,”可以匹配a12,x456.?表达式尽可能匹配1次,也可以不匹配,相当于0,1+表达式尽可能的多匹配,至少匹配1次,相当于1,*表达式尽可能的多匹配,最少可以不匹配,相当于0,匹配次数限定符匹配次数限定符使被修饰的表达式可多次重复匹配的修饰符。可使被修饰的表达式重复固定次数,也可以限定一定的重复匹配的次数范围。在限定符之后的表达式能够匹配成功的情况下,不定次数的限定符总是尽可能的多匹配。如果之后的表达式匹配失败,限定符可适当“让出”能够匹配的字符,以使整个表达式匹配成功。这种模式就叫“贪贪婪模式婪模式”。说明说明限定符限定符m,n?m,?表达式尽量只匹配m次,最多重复n次。表达式尽量只匹配m次,最多可以匹配任意次。?表达式尽量不匹配,最多匹配1次,相当于0,1?+?表达式尽量只匹配1次,最多可匹配任意次,相当于1,?*?表达式尽量不匹配,最多可匹配任意次,相当于0,?“勉强模式勉强模式”限定符:限定符:在限定符之后添加问号(?),则使限定符成为“勉强模式”。勉强模式的限定符,总是尽可能少的匹配。如果之后的表达式匹配失败,勉强模式也可以尽可能少的再匹配一些,以使整个表达式匹配成功。说明说明限定符限定符m,n+m,+表达式尽可能重复n次,至少重复m次。表达式尽可能的多匹配,至少重复m次。?+表达式尽可能匹配1次,也可以不匹配,相当于0,1+表达式尽可能的多匹配,至少匹配1次,相当于1,+*+表达式尽可能的多匹配,最少可以不匹配,相当于0,+“占有模式占有模式”限定符:限定符:在限定符之后添加加号(+),则使限定符成为“占有模式”。占有模式的限定符,总是尽可能多的匹配。与“贪婪模式”不同的是,即使之后的表达式匹配失败,“占有模式”也不会“让出”自己能够匹配的字符。转义字符转义字符 Q.EQ.E使用Q开始,E结束,可使中间的标点符号失去特殊意义,将中间的字符作为普通字符。例如:Q(a+b)*3E可匹配文本“(a+b)*3”。因为正则表达式是一个很庞杂的体系,所以我仅例举些入门的概念,更多的请参阅相关书籍及自行摸索。b一个单词的边界B一个非单词的边界G前一个匹配的结束为限制开头java条件限制为以Java为开头字符$为限制结尾java$条件限制为以java为结尾字符.条件限制除n以外任意一个单独字符java.条件限制为java后除换行外任意两个字符加入特定限制条件a-z条件限制在小写atoz范围中一个字符A-Z条件限制在大写AtoZ范围中一个字符a-zA-Z条件限制在小写atoz或大写AtoZ范围中一个字符0-9条件限制在小写0to9范围中一个字符0-9a-z条件限制在小写0to9或atoz范围中一个字符0-9a-z条件限制在小写0to9或atoz范围中一个字符(交集)中加入后加再次限制条件a-z条件限制在非小写atoz范围中一个字符A-Z条件限制在非大写AtoZ范围中一个字符a-zA-Z条件限制在非小写atoz或大写AtoZ范围中一个字符0-9条件限制在非小写0to9范围中一个字符0-9a-z条件限制在非小写0to9或atoz范围中一个字符0-9a-z条件限制在非小写0to9或atoz范围中一个字符(交集)在限制条件为特定字符出现限制条件为特定字符出现0次以上时,可以使用次以上时,可以使用*J*0个以上J.*0个以上任意字符J.*DJ与D之间0个以上任意字符在限制条件为特定字符出现1次以上时,可以使用+J+1个以上J.+1个以上任意字符J.+DJ与D之间1个以上任意字符在限制条件为特定字符出现有0或1次以上时,可以使用?JA?J或者JA出现限制为连续出现指定次数字符aJ2JJJ3JJJ文字a个以上,并且a,J3,JJJ,JJJJ,JJJJJ,?(3次以上J并存)文字个以上,b个以下a,bJ3,5JJJ或JJJJ或JJJJJ两者取一|J|AJ或AJava|HelloJava或Hello()中规定一个组合类型比如,我查询index中间的数据,可写作+href=?(*)?*(.+?)在使用Ppile函数时,可以加入控制正则表达式的匹配行为的参数:PatternPpile(Stringregex,intflag)flag的取值范围如下:Pattern.CANON_EQ当且仅当两个字符的正规分解(canonicaldecomposition)都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式au030A会匹配?。默认情况下,不考虑规范相等性(canonicalequivalence)。Pattern.CASE_INSENSITIVE(?i)默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。这个标志能让表达式忽略大小写进行匹配。要想对Unicode字符进行大小不明感的匹配,只要将UNICODE_CASE与这个标志合起来就行了。Pattern.COMMENTS(?x)在这种模式下,匹配时会忽略(正则表达式里的)空格字符(译者注:不是指表达式里的s,而是指表达式里的空格,tab,回车之类)。注释从#开始,一直到这行结束。可以通过嵌入式的标志来启用Unix行模式。Pattern.DOTALL(?s)在这种模式下,表达式.可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式.不匹配行的结束符。Pattern.MULTILINE(?m)在这种模式下,和$分别匹配一行的开始和结束。此外,仍然匹配字符串的开始,$也匹配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始和结束。Pattern.UNICODE_CASE(?u)在这个模式下,如果你还启用了CASE_INSENSITIVE*标志,那么它会对Unicode字符进行大小写不明感的匹配。默认情况下,大小写不敏感的匹配只适用于US-ASCII字符集。Pattern.UNIX_LINES(?d)在这个模式下,只有n才被认作一行的中止,并且与.,以及$进行匹配。抛开空泛的概念,下面写出几个简单的Java正则用例:比如,在字符串包含验证时/查找以Java开头,任意结尾的字符串Patternpattern=Ppile(Java.*);Matchermatcher=pattern.matcher(Java不是人);booleanb=matcher.matches();/当条件满足时,将返回true,否则返回falseSystem.out.println(b);以多条件分割字符串时Patternpattern=Ppile(,|+);Stringstrs=pattern.split(JavaHelloWorldJava,Hello,World|Sun);for(inti=0;istrs.length;i+)System.out.println(strsi);文字替换(首次出现字符)Patternpattern=Ppile(正则表达式);Matchermatcher=pattern.matcher(正则表达式HelloWorld,正则表达式HelloWorld);/替换第一个符合正则的数据System.out.println(matcher.replaceFirst(Java);文字替换(全部)Patternpattern=Ppile(正则表达式);Matchermatcher=pattern.matcher(正则表达式HelloWorld,正则表达式HelloWorld);/替换第一个符合正则的数据System.out.println(matcher.replaceAll(Java);文字替换(置换字符)Patternpattern=Ppile(“正则表达式”);Matchermatcher=pattern.matcher(“正则表达式HelloWorld,正则表达式HelloWorld”);StringBuffersbr=newStringBuffer();while(matcher.find()matcher.appendReplacement(sbr,“Java”);matcher.appendTail(sbr);System.out.println(sbr.toString();验证是否为邮箱地址Stringemail=“w.-+(w-+.)+w-+”;Stringstr=”;Patternpattern=Ppile(email,Pattern.CASE_INSENSITIVE);Matchermatcher=pattern.matcher(str);System.out.println(matcher.matches();比较严格的:email=(0-9a-zA-Z(-.w*0-9a-zA-Z)*(0-9a-zA-Z)+(-w*0-9a-zA-Z)*.)+a-zA-Z2,9)$去除html标记Patternpattern=Ppile(,Pattern.DOTALL);Matchermatcher=pattern.matcher(主页);Stringstring=matcher.replaceAll();System.out.println(string);查找html中对应条件字符串Patternpattern=Ppile(href=(.+?);Matchermatcher=pattern.matcher(主页);if(matcher.find()System.out.println(matcher.group(1);截取http:/地址/截取urlPatternpattern=Ppile(http:/|https:/)1w.-/:+);Matchermatcher=pattern.matcher(dsdsdsfdf);StringBufferbuffer=newStringBuffer();while(matcher.find()buffer.append(matcher.group();buffer.append(rn);System.out.println(buffer.toString();替换指定中文字Stringstr=Java目前的发展史是由0年-1年;Stringobject=newString0,1995,newString1,2007;System.out.println(replace(str,object);publicstaticStringreplace(finalStringsourceString,Objectobject)Stringtemp=sourceString;for(inti=0;iobject.length;i+)Stringresult=(String)objecti;Patternpattern=Ppile(result0);Matchermatcher=pattern.matcher(temp);temp=matcher.replaceAll(result1);returntemp;读取页面链接和内容:publicStringnewsListRegExp=+href=?(*)?*(.+?);newsListRegExp=+hrefs*=*s*(s|+)*(n*);publicvoidgetLinks(Stringcontent)pattern=java.util.regex.Ppile(newsListRegExp,java.util.regex.Pattern.CASE_INSENSITIVE);matcher=pattern.matcher(content);while(matcher.find()Stringlink=matcher.group(1);Stringtext=matcher.group(2);System.out.println(link+text);Java正则的功用还有很多,事实上只要是字符处理,就没有正则做不到的事情存在。(当然,正则解释时较耗时间就是了!)二、二、HTMLParser使用详解使用详解HTMLParser使用详解(使用详解(1)-初始化初始化Parser在研究搜索引擎的开发中,对于HTML网页的处理是核心的一个环节。网上有很多开源的代码,对于Java来说,HTMLParser是比较著名并且得到广泛应用的一个。HTMLParser的主页是http:/,最后的更新是2006年9月的1.6版。不过没关系,HTML的内容已经很久没有大的变化了,HTMLParser处理起来基本没有任何问题。HTMLParser的核心模块是类,这个类实际完成了对于HTML页面的分析工作。这个类有下面几个构造函数:publicParser();publicParser(Lexerlexer,ParserFeedbackfb);publicParser(URLConnectionconnection,ParserFeedbackfb)throwsParserException;publicParser(Stringresource,ParserFeedbackfeedback)throwsParserException;publicParser(Stringresource)throwsParserException;publicParser(Lexerlexer);publicParser(URLConnectionconnection)throwsParserException;和一个静态类publicstaticParsercreateParser(Stringhtml,Stringcharset);对于大多数使用者来说,使用最多的是通过一个URLConnection或者一个保存有网页内容的字符串来初始化Parser,或者使用静态函数来生成一个Parser对象。ParserFeedback的代码很简单,是针对调试和跟踪分析过程的,一般不需要改变。而使用Lexer则是一个相对比较高级的话题,放到以后再讨论吧。这里比较有趣的一点是,如果需要设置页面的编码方式的话,不使用Lexer就只有静态函数一个方法了。对于大多数中文页面来说,好像这是应该用得比较多的一个方法。HTMLParser使用详解(使用详解(2)-Node内容内容HTMLParser将解析过的信息保存为一个树的结构。Node是信息保存的数据类型基础。请看Node的定义:publicinterfaceNodeextendsCloneable;Node中包含的方法有几类:中包含的方法有几类:对于树型结构进行遍历的函数,这些函数最容易理对于树型结构进行遍历的函数,这些函数最容易理解:解:NodegetParent():取得父节点NodeListgetChildren():取得子节点的列表NodegetFirstChild():取得第一个子节点NodegetLastChild():取得最后一个子节点NodegetPreviousSibling():取得前一个兄弟(不好意思,英文是兄弟姐妹,直译太麻烦而且不符合习惯,对不起女同胞了)NodegetNextSibling():取得下一个兄弟节点取得取得Node内容的函数:内容的函数:StringgetText():取得文本StringtoPlainTextString():取得纯文本信息。StringtoHtml():取得HTML信息(原始HTML)StringtoHtml(booleanverbatim):取得HTML信息(原始HTML)StringtoString():取得字符串信息(原始HTML)PagegetPage():取得这个Node对应的Page对象intgetStartPosition():取得这个Node在HTML页面中的起始位置intgetEndPosition():取得这个Node在HTML页面中的结束位置用于用于Filter过滤的函数:过滤的函数:voidcollectInto(NodeListlist,NodeFilterfilter):基于filter的条件对于这个节点进行过滤,符合条件的节点放到list中。用于用于Visitor遍历的函数:遍历的函数:voidaccept(NodeVisitorvisitor):对这个Node应用visitor用于修改内容的函数,这类用得比较少:用于修改内容的函数,这类用得比较少:voidsetPage(Pagepage):设置这个Node对应的Page对象voidsetText(Stringtext):设置文本voidsetChildren(NodeListchildren):设置子节点列表其他函数:其他函数:voiddoSemanticAction():执行这个Node对应的操作(只有少数Tag有对应的操作)Objectclone():接口Clone的抽象函数。主要注意一下,getText,toPlainTextString,toHtml区别Stringa=猫扑hi来点不一样;Parserp=Parser.createParser(a,UTF-8);tryfor(NodeIteratorit=p.elements();it.hasMoreNodes();)Nodenode=it.nextNode();System.out.println(node.getText()+$+node.toPlainTextString()+$+node.toHtml();catch(ParserExceptione)/TODOAuto-generatedcatchblocke.printStackTrace();输出:divid=hi$猫扑hi$猫扑hiaclass=linkhref=$来点不一样$来点不一样下面是用于测试的下面是用于测试的HTML文件:文件:白泽居-白泽居-白泽居-白泽居-toPlainTextString是把用户可以看到的内容都包含了。有趣的有两点,一是标签中的Title内容是在plainText中的,可能在标题中可见的也算可见吧。另外就是象前面说的,HTML内容中的换行符什么的,也都成了plainText,这个逻辑上好像有点问题。另外可能大家发现toHtml,toHtml(true)和toHtml(false)的结果没什么区别。实际也是这样的,如果跟踪HTMLParser的代码就可以发现,Node的子类是AbstractNode,其中实现了toHtml()的代码,直接调用toHtml(false),而AbstractNode的三个子类RemarkNode,TagNode和TextNode中,toHtml(booleanverbatim)的实现中,都没有处理verbatim参数,所以三个函数的结果是一模一样的。如果你不需要实现你自己的什么特殊处理,简单使用toHtml就可以了。HTML的Node类继承关系如下图这个是从别的文章Copy的):AbstractNodes是Node的直接子类,也是一个抽象类。它的三个直接子类实现是RemarkNode,用于保存注释。在输出结果的toString部分中可以看到有一个Rem(3456,2,3566,13):这是注释,就是一个RemarkNode。TextNode也很简单,就是用户可见的文字信息。TagNode是最复杂的,包含了HTML语言中的所有标签,而且可以扩展(扩展HTMLParser对自定义标签的处理能力)。TagNode包含两类,一类是简单的Tag,实际就是不能包含其他Tag的标签,只能做叶子节点。另一类是CompositeTag,就是可以包含其他Tag,是分支节点。遍历了网页的内容以后,以树(森林)结构保存了结果。HTMLParser访问结果内容的方法有两种。使用Filter和使用Visitor。(一)(一)Filter类类顾名思义,Filter就是对于结果进行过滤,取得需要的内容。HTMLParser在包之内一共定义了16个不同的Filter,也可以分为几类。HTMLParser使用详解(使用详解(3)-通过通过Filter访问内容访问内容判断类判断类Filter:TagNameFilterHasAttributeFilterHasChildFilterHasParentFilterHasSiblingFilterIsEqualFilter逻辑运算逻辑运算Filter:AndFilterNotFilterOrFilterXorFilter其他其他Filter:NodeClassFilterStringFilterLinkStringFilterLinkRegexFilterRegexFilterCssSelectorNodeFilter所有的Filter类都实现了接口。这个接口只有一个主要函数:booleanaccept(Nodenode);各个子类分别实现这个函数,用于判断输入的Node是否符合这个Filter的过滤条件,如果符合,返回true,否则返回false。(二)判断类(二)判断类FilterHTMLParser使用入门(使用入门(2)-Node内容内容,自己添加,自己添加import部分)部分)publicstaticvoidmain(Stringargs)tryParserparser=newParser(HttpURLConnection)(newURL(http:/127.0.0.1:8080/HTMLParserTester.html).openConnection();/这里是控制测试的部分,后面的例子修改的就是这个地方。这里是控制测试的部分,后面的例子修改的就是这个地方。NodeFilterfilter=newTagNameFilter(DIV);NodeListnodes=parser.extractAllNodesThatMatch(filter);if(nodes!=null)for(inti=0;inodes.size();i+)Nodetextnode=(Node)nodes.elementAt(i);message(getText:+textnode.getText();message(=);catch(Exceptione)e.printStackTrace();输出结果:输出结果:getText:divid=top_main=getText:divid=logoindex=可以看出文件中两个可以看出文件中两个Div节点都被取出了。下面可以针对这两节点都被取出了。下面可以针对这两个个DIV节点进行操作节点进行操作2.2HasChildFilter下面让我们看看下面让我们看看HasChildFilter。刚刚看到这个。刚刚看到这个Filter的时候,的时候,我想当然地认为这个我想当然地认为这个Filter返回的是有返回的是有Child的的Tag。直接初始。直接初始化了一个化了一个NodeFilterfilter=newHasChildFilter();结果调用结果调用NodeListnodes=parser.extractAllNodesThatMatch(filter);的时候的时候HasChildFilter内部直接发生内部直接发生NullPointerException。读了一。读了一下下HasChildFilter的代码,才发现,实际的代码,才发现,实际HasChildFilter是返是返回有符合条件的子节点的节点,需要另外一个回有符合条件的子节点的节点,需要另外一个Filter作为过滤作为过滤子节点的参数。子节点的参数。缺省的构造函数虽然可以初始化,但是由于子节点的缺省的构造函数虽然可以初始化,但是由于子节点的Filter是是null,所以使用的时候发生了,所以使用的时候发生了Exception。从这点来看,从这点来看,HTMLParser的代码还有很多可以优化的的代码还有很多可以优化的的地方。呵呵。的地方。呵呵。修改代码:修改代码:NodeFilterinnerFilter=newTagNameFilter(DIV);NodeFilterfilter=newHasChildFilter(innerFilter);NodeListnodes=parser.extractAllNodesThatMatch(filter);输出结果:输出结果:getText:body=getText:divid=top_main=可以看到,输出的是两个有可以看到,输出的是两个有DIV子子Tag的的Tag节点。(节点。(body有有子节点子节点DIVtop_main,top_main有子节点有子节点logoindex。注意注意HasChildFilter还有一个构造函数:还有一个构造函数:publicHasChildFilter(NodeFilterfilter,booleanrecursive)如果如果recursive是是false,则只对第一级子节点进行过滤。,则只对第一级子节点进行过滤。比如前面的例子,比如前面的例子,body和和top_main都是在第一级的子节点里都是在第一级的子节点里就有就有DIV节点,所以匹配上了。如果我们用下面的方法调用:节点,所以匹配上了。如果我们用下面的方法调用:NodeFilterfilter=newHasChildFilter(innerFilter,true);输出结果:输出结果:getText:htmlxmlns=http:/www.w3.org/1999/xhtml=getText:body=getText:divid=top_main=可以看到输出结果中多了一个可以看到输出结果中多了一个htmlxmlns=http:/www.w3.org/1999/xhtml,这个是整个,这个是整个HTML页面的节点(根节点),虽然这个节点下直接没有页面的节点(根节点),虽然这个节点下直接没有DIV节点,但是它的子节点节点,但是它的子节点body下面有下面有DIV节点,所以它也被匹节点,所以它也被匹配上了。配上了。2.3HasAttributeFilterHasAttributeFilter有有3个构造函数:个构造函数:publicHasAttributeFilter();publicHasAttributeFilter(Stringattribute);publicHasAttributeFilter(Stringattribute,Stringvalue);这个Filter可以匹配出包含制定名字的属性,或者制定属性为指定值的节点。还是用例子说明比较容易。调用方法调用方法1:NodeFilterfilter=newHasAttributeFilter();NodeListnodes=parser.extractAllNodesThatMatch(filter);输出结果:输出结果:什么也没有输出。什么也没有输出。调用方法调用方法2:NodeFilterfilter=newHasAttributeFilter(id);NodeListnodes=parser.extractAllNodesThatMatch(filter);输出结果:输出结果:getText:divid=top_main=getText:divid=logoindex=调用方法调用方法3:NodeFilterfilter=newHasAttributeFilter(id,logoindex);NodeListnodes=parser.extractAllNodesThatMatch(filter);输出结果:输出结果:getText:divid=logoindex=很简单吧。呵呵很简单吧。呵呵2.4其他判断列其他判断列FilterHasParentFilter和和HasSiblingFilter的功能与的功能与HasChildFilter类似,大家自己试一下就应该了解了。类似,大家自己试一下就应该了解了。IsEqualFilter的构造函数参数是一个的构造函数参数是一个Node:publicIsEqualFilter(Nodenode)mNode=node;accept函数也很简单:函数也很简单:publicbooleanaccept(Nodenode)return(mNode=node);不需要过多说明了。不需要过多说明了。(三)逻辑运算(三)逻辑运算Filter(四)其他(四)其他Filter:HTMLParser使用使用入门(入门(2)-Node内容内容中我们已经了解了中我们已经了解了Node的不同类型,的不同类型,这个这个Filter就可以针对类型进行过滤。就可以针对类型进行过滤。测试代码:测试代码:NodeFilterfilter=newNodeClassFilter(RemarkNode.class);NodeListnodes=parser.extractAllNodesThatMatch(filter);输出结果:输出结果:getText:这是注释这是注释=可以看到只有可以看到只有RemarkNode(注释)被输出了。(注释)被输出了。4.2StringFilter这个这个Filter用于过滤显示字符串中包含制定内容的用于过滤显示字符串中包含制定内容的Tag。注意。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示。链接等等)不会被显示。修改一下例子代码:修改一下例子代码:白泽居白泽居-title-白泽居白泽居-字符串字符串白泽居白泽居-链接文本链接文本-白泽居白泽居-字符串字符串2-测试代码:测试代码:NodeFilterfilter=new);NodeListnodes=parser.extractAllNodesThatMatch(filter);输出结果:输出结果:getText:白泽居白泽居-title-=getText:白泽居白泽居-字符串字符串1-=getText:白泽居白泽居-链接文本链接文本-=getText:白泽居白泽居-字符串字符串2-=可以看到包含可以看到包含title,两个内容字符串和链接的文本字符,两个内容字符串和链接的文本字符串的串的Tag都被输出了,但是注释和链接都被输出了,但是注释和链接Tag本身没有输出。本身没有输出。4.3LinkStringFilter这个这个Filter用于判断链接中是否包含某个特定的字符串,用于判断链接中是否包含某个特定的字符串,可以用来过滤出指向某个特定网站的链接。可以用来过滤出指向某个特定网站的链接。测试代码:测试代码:NodeFilterfilter=new);NodeListnodes=parser.extractAllNodesThatMatch(filter);输出结果:输出结果:getText:ahref=http:/=4.4其他几个其他几个Filter其他几个其他几个Filter也是根据字符串对不同的域进行判断,与前面也是根据字符串对不同的域进行判断,与前面这些的区别主要就是支持正则表达式。这个不在本文的讨论这些的区别主要就是支持正则表达式。这个不在本文的讨论范围以内,大家可以自己实验一下。范围以内,大家可以自己实验一下。前面介绍的都是简单的前面介绍的都是简单的Filter,只能针对某种单一类型的条件,只能针对某种单一类型的条件进行过滤。进行过滤。HTMLParser支持对于简单类型的支持对于简单类型的Filter进行组合,进行组合,从而实现复杂的条件。原理和一般编程语言的逻辑运算是一从而实现复杂的条件。原理和一般编程语言的逻辑运算是一样的。样的。3.1AndFilterAndFilter可以把两种可以把两种Filter进行组合,只有同时满足条件的进行组合,只有同时满足条件的Node才会被过滤。才会被过滤。测试代码:测试代码:NodeFilterfilterID=newHasAttributeFilter(“id”);NodeFilterfilterChild=newHasChildFilter(filterA);NodeFilterfilter=newAndFilter(filterID,filterChild);输出结果:输出结果:getText:divid=“logoindex”=3.2OrFilter把前面的把前面的AndFilter换成换成OrFilter测试代码:测试代码:NodeFilterfilterID=newHasAttributeFilter(id);NodeFilterfilterChild=newHasChildFilter(filterA);NodeFilterfilter=newOrFilter(filterID,filterChild);输出结果:输出结果:getText:divid=top_main=getText:divid=logoindex=3.3NotFilter把前面的把前面的AndFilter换成换成NotFilter测试代码:测试代码:NodeFilterfilterID=newHasAttributeFilter(id);NodeFilterfilterChild=newHasChildFilter(filterA);NodeFilterfi

    注意事项

    本文(正则表达式HTMLParser使用详解.ppt)为本站会员(wuy****n92)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开