六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 41|回复: 0

htmlparse实践

[复制链接]

升级  70%

7

主题

7

主题

7

主题

童生

Rank: 1

积分
35
 楼主| 发表于 2013-1-26 13:38:21 | 显示全部楼层 |阅读模式
这几天小侄子天天缠着我要听儿歌,蛮横的霸占我的电脑,想着干脆帮他网站里面的中文flash都下下来,一个个下显然不符合我们程序员的风格,加上前几天单位的一个研究生问了我一些htmlparse的事(不太熟,回答不上来 ),合着今晚要熬夜看欧冠决赛,乘着决赛钱还有3个小时,来研究一下这个抓取网页内容的东东
  目标抓取网址是 http://www.qbaobei.com/里面的中文flash儿歌
先用迅雷讲列表批量下载下来,存到C:\TDDOWNLOAD\html里面,共有8 个网页

   现在的目标很简单,就是根据列表页,获取各个flash的展示页面url 然后再根据展示页面url 获取flash的播放地址,存入一个文件中

---------------------------------------------------------------------
htmlParse采用的是经典的Composite模式,通过RemarkNode,TextNode...来描述HTML页面的中的元素

htmlParse有两种方式访问网页,Visitor和FIlter方式

代码如下
public void testVistor(){Parser parser=new Parser();try {parser.setURL("http://www.qbaobei.com/");parser.setEncoding("UTF-8");NodeVisitor  nodeVisitor=new NodeVisitor(){public void visitTag(Tag tag) {System.out.println(tag.getTagName()+"---"+tag.getClass());}};parser.visitAllNodesWith(nodeVisitor);} catch (ParserException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void testFilter(){try {NodeFilter filter=new NodeClassFilter(LinkTag.class);Parser parser=new Parser();parser.setURL("http://www.qbaobei.com/");parser.setEncoding("UTF-8");NodeList list=parser.extractAllNodesThatMatch(filter);//循环list} catch (ParserException e) {// TODO Auto-generated catch blocke.printStackTrace();}}



以下是打印出所有url的代码

public  void getFlashUrl(List list,int start){try {NodeFilter filter=new AndFilter(new TagNameFilter("Object"),new HasAttributeFilter("id","flashObject"));Parser parser=new Parser();System.out.println("start");for (int s=start;s<list.size();s++) {count++;String url = (String) list.get(s);if("http://www.qbaobei.com/Html/erge/FZEG/09593133.htm".equalsIgnoreCase(url))continue;parser.setURL(url);parser.setEncoding("UTF-8");NodeList oblist=parser.extractAllNodesThatMatch(filter);//循环listNode node=oblist.elementAt(0);ObjectTag tag = (ObjectTag)node;if(tag!=null&&tag.getParameter("Src")!=null){String print=tag.getParameter("Src");if(!print.startsWith("http:"))print="http://f.qbaobei.com"+print;System.out.println(print);}}System.out.println("end");} catch (Exception e) {// TODO Auto-generated catch blockSystem.out.println(count);getFlashUrl(list,count++);e.printStackTrace();}}public  List testFilter(){ArrayList linkList=new ArrayList();try {NodeFilter filter=new AndFilter(new TagNameFilter("a"),new HasAttributeFilter("class","li_img w100 mgl10 mgb6 gray"));Parser parser=new Parser();for(int j=1;j<9;j++){parser.setResource("C:\\TDDOWNLOAD\\html\\index_"+j+".htm");parser.setEncoding("UTF-8");NodeList list=parser.extractAllNodesThatMatch(filter);//循环listfor(int i=0;i<list.size();i++){Node node=list.elementAt(i);if(node instanceof LinkTag){ LinkTag link = (LinkTag)node; String url=link.getLink(); String realLink=url.replaceAll("file://localhost/", "http://www.qbaobei.com/"); linkList.add(realLink);}}}} catch (ParserException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("共有"+linkList.size());return linkList;}public static void main(String[] args) {GetFlashUrl g=new GetFlashUrl();g.getFlashUrl(g.testFilter(),0);}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表