这几天小侄子天天缠着我要听儿歌,蛮横的霸占我的电脑,想着干脆帮他网站里面的中文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 block
e.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 block
e.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);
//循环list
Node 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 block
System.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);
//循环list
for(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 block
e.printStackTrace();
}
System.out.println("共有"+linkList.size());
return linkList;
}
public static void main(String[] args) {
GetFlashUrl g=new GetFlashUrl();
g.getFlashUrl(g.testFilter(),0);
}