问题描述
我在编写一个程序,功能是获取网页里面标签<b>和<p>里面的内容(包括这两个标签),可是我只能获取到<b>的内容,这是为什么呢??我的程序如下所示:importjava.io.*;importjava.net.URL;importjava.util.regex.*;publicclassFilter{staticStringsourceContent;//以下是获取网页内容publicstaticvoidgetSourceContent(){StringBuffersb=newStringBuffer();try{URLurl=newUR("http://www.wyu.cn/news/news_zxtz/200942111210750924.htm");InputStreamReaderisr=newInputStreamReader(url.openStream());BufferedReaderbr=newBufferedReader(isr);Stringtemp=null;while((temp=br.readLine())!=null){//System.out.println(temp);pw.println(temp);sb.append(temp+"r");sourceContent=sb.toString();}br.close();}catch(Exceptione){System.out.println(e);}}//endgetSourceContent//以下是运用正则表达式获取<bady></body>之间内容publicstaticvoidmatch(){StringpatternStr="(?is)<body.*?>.*?((<b>.*?</b>)|(<p.*?>.*?</p>)).*?</body>";//正则表达式StringBuffersb1=newStringBuffer();Patternp=Pattern.compile(patternStr);//匹配<body>开头,</body>结尾的文档Matcherm=p.matcher(sourceContent);//开始编译while(m.find()){sb1.append(m.group(0));//获取被匹配的部分}System.out.println(sb1);}publicstaticvoidmain(Stringargs[])throwsIOException{getSourceContent();match();}}
解决方案
解决方案二:
正则表达式问题你的问题是忽略了'.'是不匹配换行的只给你写个获取<body></body>之间内容的剩下的lz自己发挥一下StringpatternStr="<body.*?>((.*)|(\s*))*</body>";//正则表达式
解决方案三:
你的程序的正则表达式哪里有错误StringpatternStr="(?is)<body.*?>.*?((<b>.*?</b>)|(<p.*?>.*?</p>)).*?</body>";//正则表达式你把StringpatternStr这里的清清空格;就是正则表达式的毛病,我调试后运行后出来了importjava.io.*;importjava.net.URL;importjava.util.regex.*;publicclassFilter{staticStringsourceContent;publicstaticvoidmain(Stringargs[])throwsIOException{getSourceContent();match();}//以下是获取网页内容publicstaticvoidgetSourceContent(){StringBuffersb=newStringBuffer();try{URLurl=newURL("http://localhost:8080/CSDN_Question/index.html");InputStreamReaderisr=newInputStreamReader(url.openStream());BufferedReaderbr=newBufferedReader(isr);Stringtemp=null;System.out.println("进入了getSourceContent============");//temp=br.readLine();while((temp=br.readLine())!=null){System.out.println(temp);sb.append(temp+"r");sourceContent=sb.toString();}br.close();}catch(Exceptione){System.out.println(e);}}//endgetSourceContent//以下是运用正则表达式获取<bady></body>之间内容publicstaticvoidmatch(){StringpatternStr="(?is)<body.*?>.*?((<b>.*?</b>)|(<p.*?>.*?</p>)).*?</body>";//正则表达式StringBuffersb1=newStringBuffer();Patternp=Pattern.compile(patternStr);//匹配<body>开头,</body>结尾的文档Matcherm=p.matcher(sourceContent);//开始编译System.out.println("进入了match()");while(m.find()){System.out.println("进入了m.find()");sb1.append(m.group(0));//获取被匹配的部分}System.out.println(sb1);}
解决方案四:
importjava.io.*;importjava.net.URL;importjava.util.Vector;importjava.util.regex.*;/***作者:李 世贵*JDK:1.6*来源:http://blog.csdn.net/lishigui*欢迎转接,请保留作者和来源,谢谢!*2009-4-2614:12:48*/publicclassFilter{privateStringsourceContent=null;publicFilter(){getSourceContent();getBody();System.out.println(sourceContent);getB();getP();}privatevoidgetB(){System.out.println("匹配<body>体中的<b>");PatternbP=Pattern.compile("<b>.*</b>");MatcherbM=bP.matcher(sourceContent);while(bM.find()){System.out.println(sourceContent.substring(bM.start(),bM.end()));}}privatevoidgetP(){System.out.println("匹配<body>体中的<p>");PatternpP=Pattern.compile("<p>.*</p>");MatcherpM=pP.matcher(sourceContent);while(pM.find()){System.out.println(sourceContent.substring(pM.start(),pM.end()));}}privatevoidgetBody(){System.out.println("匹配<body>开头,</body>结尾的文档");Patternp=Pattern.compile("<body.*");MatchermStart=p.matcher(sourceContent);mStart.find();p=Pattern.compile(".*</body>");MatchermEnd=p.matcher(sourceContent);mEnd.find();sourceContent=sourceContent.substring(mStart.start(),mEnd.end());}privatevoidgetSourceContent(){StringBuffersb=newStringBuffer();try{URLurl=newURL("http://www.wyu.cn/news/news_zxtz/200942111210750924.htm");InputStreamReaderisr=newInputStreamReader(url.openStream());BufferedReaderbr=newBufferedReader(isr);Stringtemp=null;while((temp=br.readLine())!=null){sb.append(temp+"r");sourceContent=sb.toString();}br.close();}catch(Exceptione){System.out.println(e);}}publicstaticvoidmain(String[]lsg){newFilter();}}
解决方案五:
body体的内容应该是这样匹配:Patternbody=Pattern.compile("<body.*</body>");Matchermbody=body.matcher(sourceContent);if(mbody.find()){System.out.println(sourceContent.substring(mbody.start(),mbody.end()));}标签<p>的正则表达是:<p>.*</p>标签<b>的正则表达是:<b>.*</b>标签<body>的正则表达是:<body.*</body>
解决方案六:
引用3楼lishigui的回复:
Javacodeimportjava.io.*;importjava.net.URL;importjava.util.Vector;importjava.util.regex.*;/***作者:李 世贵*JDK:1.6*来源:http://blog.csdn.net/lishigui*欢迎转接,请保留作者和来源,谢谢!*2009-4-2614:12:48*/publicclassFilter{privateStringsourceContent=null;publicFilter(){getSourceContent();getBody();System.out.println(sourceContent);getB();…
这样点代码看这很清爽
解决方案七:
.*?这个匹配的是什么内容,解释下好么
解决方案八:
学习中
解决方案九:
可是你们的程序还是不符合我的要求啊,我是要提取出<b>和<p>标签的内容(包括标签)。
解决方案十:
谢谢你们!
解决方案十一:
你执行过我上面的代码没?上面的代码是可以提取出<b>和<p>标签的内容(包括标签)和下面的是等价的importjava.io.*;importjava.net.URL;importjava.util.Vector;importjava.util.regex.*;/***作者:李 世贵*JDK:1.6*来源:http://blog.csdn.net/lishigui*欢迎转接,请保留作者和来源,谢谢!*2009-4-2709:12:48*/publicclassFilter{privateStringsourceContent=null;privateVectorvB=newVector();privateVectorvP=newVector();publicFilter(){getSourceContent();getBody();System.out.println(sourceContent);getB();getP();System.out.println("提取<body>的内容是:");System.out.println(sourceContent);System.out.println("提取<b>的内容是:");for(inti=0;i<vB.size();i++){System.out.println(vB.get(i).toString());}System.out.println("提取<p>的内容是:");for(inti=0;i<vP.size();i++){System.out.println(vP.get(i).toString());}}privatevoidgetB(){System.out.println("匹配<body>体中的<b>");PatternbP=Pattern.compile("<b>.*</b>");MatcherbM=bP.matcher(sourceContent);while(bM.find()){vB.add(sourceContent.substring(bM.start(),bM.end()));}}privatevoidgetP(){System.out.println("匹配<body>体中的<p>");PatternpP=Pattern.compile("<p>.*</p>");MatcherpM=pP.matcher(sourceContent);while(pM.find()){vP.add(sourceContent.substring(pM.start(),pM.end()));}}privatevoidgetBody(){Patternbody=Pattern.compile("<body.*</body>");Matchermbody=body.matcher(sourceContent);if(mbody.find()){sourceContent.substring(mbody.start(),mbody.end());}}privatevoidgetSourceContent(){StringBuffersb=newStringBuffer();try{URLurl=newURL("http://www.wyu.cn/news/news_zxtz/200942111210750924.htm");InputStreamReaderisr=newInputStreamReader(url.openStream());BufferedReaderbr=newBufferedReader(isr);Stringtemp=null;while((temp=br.readLine())!=null){sb.append(temp+"r");sourceContent=sb.toString();}br.close();}catch(Exceptione){System.out.println(e);}}publicstaticvoidmain(String[]lsg){newFilter();}}
解决方案十二:
.*是指任意字符0个或n个,但是不匹配'n'
解决方案十三:
学习一下
解决方案十四:
回10楼:你的运行结果如下:提取<b>的内容是:<b>学术讲座</b>提取<p>的内容是:<p>的内容没有出来啊?
解决方案十五:
学习一下!
解决方案:
.匹配除换行符以外的任意字符*?表示重复任意次,但尽可能少重复
解决方案:
学习一下……
解决方案:
其实上面的匹配是没问题的,有问题的是:<p>这个标签可以没有</p>和它匹对出现哦!<b>和<p>标签的匹配过程是一样的,既然<b>能匹配,那<p>也应该能,你应该先看看<p>和</p>是不是没有匹对出现。
解决方案:
<p>和</p>有成对出现!
解决方案:
importjava.io.*;importjava.net.URL;importjava.util.Vector;importjava.util.regex.*;/***作者:李 世贵*JDK:1.6*来源:http://blog.csdn.net/lishigui*欢迎转接,请保留作者和来源,谢谢!*2009-4-2908:43:18*/publicclassFilter{privateStringsourceContent=null;privateVectorvB=newVector();privateVectorvP=newVector();publicFilter(){getSourceContent();getBody();System.out.println(sourceContent);getB();getP();System.out.println("提取<body>的内容是:");System.out.println(sourceContent);System.out.println("提取<b>的内容是:");for(inti=0;i<vB.size();i++){System.out.println(vB.get(i).toString());}System.out.println("提取<p>的内容是:");for(inti=0;i<vP.size();i++){System.out.println(vP.get(i).toString());}}privatevoidgetB(){System.out.println("匹配<body>体中的<b>");PatternbP=Pattern.compile("<b>.*</b>");MatcherbM=bP.matcher(sourceContent);while(bM.find()){vB.add(sourceContent.substring(bM.start(),bM.end()));}}privatevoidgetP(){System.out.println("匹配<body>体中的<p>");PatternpP=Pattern.compile("<p>.*</p>");MatcherpM=pP.matcher(sourceContent);while(pM.find()){vP.add(sourceContent.substring(pM.start(),pM.end()));}}privatevoidgetBody(){Patternbody=Pattern.compile("<body.*</body>");Matchermbody=body.matcher(sourceContent);if(mbody.find()){sourceContent.substring(mbody.start(),mbody.end());}}privatevoidgetSourceContent(){StringBuffersb=newStringBuffer();try{URLurl=newURL("http://www.wyu.cn/news/news_zxtz/200942111210750924.htm");InputStreamReaderisr=newInputStreamReader(url.openStream());BufferedReaderbr=newBufferedReader(isr);Stringtemp=null;while((temp=br.readLine())!=null){//sb.append(temp+"r");sb.append(temp);sourceContent=sb.toString();}br.close();}catch(Exceptione){System.out.println(e);}}publicstaticvoidmain(String[]lsg){newFilter();}}
解决方案:
看看上面的代码,看看能不能得到你来的效果哦!!
解决方案:
还是不行哦!