困扰我好几天了,请高手为我解答一下!

问题描述

我在编写一个程序,功能是获取网页里面标签<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();}}

解决方案:
看看上面的代码,看看能不能得到你来的效果哦!!
解决方案:
还是不行哦!

时间: 2024-10-10 15:13:49

困扰我好几天了,请高手为我解答一下!的相关文章

c++ primer...-C++新手,请大家为我解答第二题!非常感谢

问题描述 C++新手,请大家为我解答第二题!非常感谢 请大家给我解答一下第二题!谢谢了,还有为什么我看C++ primer plus这本书前面教的我都懂就是到练习题不会做了? 解决方案 #include <iostream>using namespace std;int main(){ cout << ""please enter long:"" << endl; double l; cin >> l; cout &l

路由器-数据链路层协议问题,请高手来解答

问题描述 数据链路层协议问题,请高手来解答 请问数据链路层封装,如果交换机或者路由器对应的接口上没有encapsulation之类的封装命令,那么这个接口是否还有一个默认封装和解封装的协议?比如我接口没有配置encapsulation封装类型,那么这个接口默认就是封装和解封装以太网帧?请知道的告诉下,谢谢了,还有个问题,pppoe拨号上网,如果我电脑直接连接在光猫上,通过电脑拨号,请问从我电脑网卡出去的数据链路帧是以太网帧还是ppp帧,还是说ppp帧被封装在了以太网帧内,如果是最后一种情况,那么

急!请高手帮忙解答

问题描述 在sturts2中用国际化时,在application级别中保存了中文和英文的资源包,然而当我把浏览器设置成其他非英文或中文的locale时,得到的结果却是中文页面,确定程序访问了中文资源包,请问struts2会根据操作系统的语言环境加载默认资源包吗? 解决方案 解决方案二:在线顶,等高手帮忙解答,感激不尽解决方案三:你把浏览器设置成其他非英文或中文的locale后,重新开一个浏览器再访问解决方案四:假如配置了中文和英文还有一个默认的properties文件,和struts-confi

遇到了一个问题,请高手为我指点迷津。

问题描述 如何高效处理数据,比如说从一个listbox中选中100000条记录导入到另一个listbox时,耗时太长了.这种情况该怎么解决? 解决方案 解决方案二:擦!一个listbox显示10W条数据本来就够慢的了,还要导入到另一个listbox,必须更慢,相当慢.你可以从listbox的数据源中复制出10W条记录到另一个集合,然后再用另一个listbox绑定,但是绑定10W条数据要让其显示的话,肯定很慢.你可以分页显示,这样可以减轻UI呈现慢的问题,如果仅仅对listbox的数据源进行复制的

【紧急】HighCharts Categories问题,请高手帮忙解答

问题描述 各位高手们,你们好在最近的一个项目里面,用到HighCharts实现图表,要求Y轴坐标值以科学计数法形式展现,X轴以"季度Q/年份"形式展现.目前,使用对数值形式勉强可以实现Y轴坐标值的要求,但存在错误.程序里面传递的是对数,对于"-1E-5"和"1E-5",不能区分,而"1E-5"本应在"0"上面,显示时却是在"0"的下方.另外,X轴值以Categories属性进行设置的,在

新手求助:openstack安装后使用错误,请高手帮忙解答下,谢谢!

问题描述 按照教程,在ubuntu12.04上安装了单节点的Openstack,本机是在虚拟机上跑的ubuntu,开启了双网卡,一个是NAT,另外一个是Custom:Specificvirtualnetwork但是出现了以下问题:1.root@ubuntu:~#novalistERROR:stringindicesmustbeintegers,notstr2.网页进入本机IP,输入账号密码后出现:InternalServerErrorAnunexpectederroroccurredwhilep

信息转换,请高手帮忙解答!!!

问题描述 有MapGIS点和线的数据6G多,怎么把这些信息整小一点. 解决方案 解决方案二:数据内容都是啥啊,单纯文件整小的话,winrar.为啥要整小呢解决方案三:1,把属性数据没用的删除.2,在保证精确度的前提下,把多余数据删除.3,自己设计格式保存.(用整数保存,其他策略等).

请高手过来看看这段代码,老发生System.StackOverflowException 的异常!!!

问题描述 DimiAsInteger'以下代码要求每次只能选择一条记录数据IfListView1.Items.Count<>0ThenFori=0ToListView1.Items.Count-1IfListView1.Items(i).Checked=TrueThenListView1.Items(i).Checked=FalseEndIfNextiEndIfe.Item.Checked=True请高手帮忙解答谢谢!!! 解决方案 解决方案二:自己找到问题了,最后句多余直接去掉就OK了!

请诸位帮忙解答很简单的考题^_^

问题描述 不好意思帮同事[img=http://photo.yupoo.com/dk1802/739336fc6e22/medium/][/img][img=http://photo.yupoo.com/dk1802/757656fc6e2d/medium/][/img]的忙帮着发出来这个考卷我知道比较简单但是我对这方面压根就不懂请高手给予解答 解决方案 解决方案二:还有[img=http://photo.yupoo.com/dk1802/396546fc6e34/medium/][/img][