<%@ page language="java" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>超链接测试页面</title>
<script language="javascript">
function test1() {
var para = 1;
window.location.href = "aaa.do?para="+para;
}
function test2() {
var para = document.getElementById("para").value;
form1.action = "bbb.do?para="+para;
form1.submit();
}
</script>
</head>
<body>
<a onclick="test1()">1111111111111111111111111111</a>
<a onclick="test2()">2222222222222222222222222222</a>
<a href="ccc.do?para=3">3333333333333333333333333</a>
<form name="form1">
<input type="text" id="para" value="2">
</form>
</body>
</html>
如上所示:我要获取页面上所有超链接地址:
aaa.do?para=1
bbb.do?para=2
ccc.do?para=3我搜了两天百度和谷歌,找到的全是获取静态超链接ccc.do?para=3的方法,前面两种无法实现,求高人指点迷津...

解决方案 »

  1.   

    公司的项目要求:给一个地址连接,就能分析所有给定连接的超链接比如:给你http://www.sina.com.cn/你就得分析出如下结果:
    <a href="http://news.sina.com.cn/">
    <a href="http://mil.news.sina.com.cn">
    <a href="http://news.sina.com.cn/society/">
    <a href="http://finance.sina.com.cn/">
    <a href="http://finance.sina.com.cn/stock/">
    <a href="http://finance.sina.com.cn/fund/">
    <a href="http://tech.sina.com.cn/">
    <a href="http://mobile.sina.com.cn/">
    <a href="http://digi.sina.com.cn/">
    <a href="http://sports.sina.com.cn/">
    <a href="http://sports.sina.com.cn/csl/">
    <a href="http://sports.sina.com.cn/nba/">
    <a href="http://ent.sina.com.cn/">
    <a href="http://ent.sina.com.cn/star/">
    <a href="http://yue.sina.com.cn/">
    <a href="http://auto.sina.com.cn/">
    <a href="http://photo.auto.sina.com.cn/">
    <a href="http://auto.sina.com.cn/autocenter/">
    <a href="http://blog.sina.com.cn/">
    <a href="http://blog.sina.com.cn/lm/ruiblog/">
    ......但是我现在做的程序只能分析到这里,全是分析静态连接的,动态调用JS函数跳转的连接无法获取,这是让我比较困扰的地方,分析程序如下(其实也是照人抄的...):
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import java.util.regex.PatternSyntaxException;public class HrefMatch {
    public static void main(String[] args)
       {
          try
          {
             // get URL string from command line or use default
             String urlString = "http://java.sun.com";
             if (args.length > 0) {
              urlString = args[0];
             }
     System.out.println("开始分析地址"+urlString);          // open reader for URL
             InputStreamReader in = new InputStreamReader(new URL(urlString).openStream());
             // read contents into string buffer
             StringBuilder input = new StringBuilder();
             int ch;
             while ((ch = in.read()) != -1) input.append((char) ch);          // search for all occurrences of pattern 
             String patternString = "<a\\s+href\\s*=\\s*(\"[^\"]*\"|[^\\s>])\\s*>";
             Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
             Matcher matcher = pattern.matcher(input);          while (matcher.find())
             {
                int start = matcher.start();
                int end = matcher.end();
                String match = input.substring(start, end);
                System.out.println(match);
             }
             
          }
          catch (IOException e)
          {
             e.printStackTrace();
          }
          catch (PatternSyntaxException e)
          {
             e.printStackTrace();
          }
       }
    }
      

  2.   

    正则表达式就可以的!http(s)?://([\w-]\.)[\w-].*
      

  3.   

    function test1() {
        var para = 1;
        window.location.href = "aaa.do?para="+para;
    }
    <a onclick="test1()">1111111111111111111111111111</a>
    这种东西也能获取到解析好的地址 aaa.do?para=1 吗?
    我要的是aaa.do?para=1 
    不是"aaa.do?para="+para;
      

  4.   

    我只是列举了最简单的JS跳转函数,在实际应用中也许更加复杂,最后的那个para也许经过无数次计算才能得出...所以个人觉得,任何语法分析也无法获得复杂的JS计算...最好的方法就是模拟点击...模拟点击这个<a onclick="test1()">1111111111111111111111111111</a>获取点击后页面跳转的URL,记录它,这个才能得到跳转最终的准确地址...不然光靠分析..很难吧
      

  5.   

    URLConnection 可以获取网页内容,你去查相关API,获取后使用正则表达试,获取<a></a>之间的内容
      

  6.   

    大家仔细看看要求啊....
    function test1() {
    var para = 1;
    window.location.href = "aaa.do?para="+para;
    }
    <a onclick="test1()">1111111111111111111111111111</a>类似于这种跳转方式,你能用简单的正则表达式解析出来
    aaa.do?para=1
    .....我觉得需要更加复杂的方式,比如直接点这个超链接,看跳到的URL具体是多少,然后记录下来...我需要的应该是一个模拟点击超链接的思路,而不是一个复杂的正则表达式分析...
      

  7.   

    如果你想使用javascript拿到网页的a标签的话:可以使用document.getElementByTag("a"),返回一个数组,但是这个方法无法拿到js脚本中的连接跳转;如果你要通过java解析html拿到a标签的话,我建议你使用htmlParser这个jar包中的方法,使用过滤器来进行筛选!
      

  8.   

    12楼的第二套方案可以借鉴...但是htmlParser也是对页面的a标签进行解析,能分析出JS函数中的最终跳转地址吗?