一道面试题

liuzhe_2008 2010-10-07 03:33:09
给定一个URL 下载这个页面和这个页面中的所有连接 怎么做 ?
...全文
173 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
aijezdm915 2010-10-09
<[aA][^>]*[hH][rR][eE][fF][^>]*>
???
回复
chenbb110 2010-10-09
很强大
回复
有一天呵呵 2010-10-07
呵呵,不错
回复
voice1122 2010-10-07
学习了
回复
龙四 2010-10-07
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ObtainLinks {
private String pageSrc;
private String url;

public ObtainLinks(String url) throws MalformedURLException,IOException{
this.url = url;
pageSrc = getPageSrc(url);
}

/**
* 根据strUrl获取网页源文件.
* @param strURL
* @return 源文件为空,返回空串
* @throws MalformedURLException
* @throws IOException
*/
private String getPageSrc(String strUrl) throws MalformedURLException,IOException {
StringBuffer sb = new StringBuffer();
java.net.URL url = new java.net.URL(strUrl);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
in.close();
return sb.toString();
}

/**
* 获取网页中所有包含href属性的<a>标签.
* @return pageSrc(网页源码)为空,返回null
*/
private List<String> getAnchorContent(){
if(pageSrc == null) {
return null;
}
List<String> list = new ArrayList<String>();
String regex = "<[a|A][^>]*[h|H][r|R][e|E][f|F][^>]*>";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(pageSrc);
while(matcher.find()){
list.add(matcher.group());
}
return list;
}


public List<String> getUrls() {
List<String> anchorList = getAnchorContent();
if(anchorList == null){
return null;
}

List<String> list = new ArrayList<String>();
Pattern pattern;
for(String anchor:anchorList) {

//<a href="www.baidu.com">
if(anchor.matches(".*[h|H][r|R][e|E][f|F]\\s*=\\s*\"[^\"]*\".*")) {
pattern = Pattern.compile("[h|H][r|R][e|E][f|F]\\s*=\\s*\"[^\"]+\"");
Matcher matcher = pattern.matcher(anchor);
while(matcher.find()){
list.add(matcher.group());
}
continue;
}

//<a href='www.baidu.com'>
if(anchor.matches(".*[h|H][r|R][e|E][f|F]\\s*=\\s*\'[^\']*\'.*")) {
pattern = Pattern.compile("[h|H][r|R][e|E][f|F]\\s*=\\s*\'[^\"]+\'");
Matcher matcher = pattern.matcher(anchor);
while(matcher.find()){
list.add(matcher.group());
}
continue;
}

//<a href=www.baidu.com>
if(anchor.matches(".*[h|H][r|R][e|E][f|F]\\s*=\\s*[^\\s]*.*")) {
pattern = Pattern.compile("[h|H][r|R][e|E][f|F]\\s*=\\s*[^\\s]+[\\s+|>]");
Matcher matcher = pattern.matcher(anchor);
while(matcher.find()){
String str = matcher.group();
list.add(str.substring(0, str.length()-1));
}
continue;
}
}


return list;
}
public static void main(String[] args) throws Exception{
List<String> list = new ObtainLinks("http://sports.sina.com.cn/nba/").getUrls();
for(String str:list){
System.out.println(str);
}
}
}
回复
thegodofwar 2010-10-07
[Quote=引用 1 楼 ticmy 的回复:]
Java code
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
……
[/Quote]
类似这种
<[a|A][^>]*[h|H][r|R][e|E][f|F][^>]*>
的正则表达式写的都不对,比如这个它还能匹配
String str="<| agghd||||ggdhhdj>";
这样的字符串,‘或’应该是这样写
<[aA][^>]*[hH][rR][eE][fF][^>]*>
回复
shauxiaoxin 2010-10-07
不错!不错!
回复
feifei694893239 2010-10-07
这个必须要收藏啊
回复
popoweiqi 2010-10-07
mark,学习了。不介意我把代码带走了吧,哈哈。
回复
DBMS_TTT 2010-10-07
学习学习
回复
fczfr 2010-10-07
不错,很犀利
回复
i11111 2010-10-07
噢,不错,学习了,我想到是用一般下载软件,呵呵
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2010-10-07 03:33
社区公告
暂无公告