在做一个项目时,需要分析html文件的源码,我选择用htmlparser,但是在解析源码的时候发现,页面的数据是动态的利用javascript函数从后台中导入的,试问如何读取js函数中的值?

解决方案 »

  1.   

    这个好像不行吧。建议你使用HttpConnection, 然后getinputstream(),把包含了动态内容的Html源码分析出来。
      

  2.   

    我用过httpurlconnection,连接以后getInputstream()以后,保存下来都是网页阿?他怎么将html动态内容分析出来呢?谢谢!
      

  3.   

    比如当查询的时候,后台将查询的数据先存放在一个数组data中,然后调用js函数将其赋值到表中,那么我怎么取出这个data的值呢?
      

  4.   

    data 应该不在当前页面里面,是不是当你点查询的时候才有数据显示?
    如果是这样的话,应该是 js 与 后台有个交互的过程取数据,也就是 js 应该发了另一个请求,数据也该在另一个也面里
    而不在当前页面
      

  5.   

    将查询的链接再 urlconnection 一次
    得到的网页就有你需要的 data 
      

  6.   

    感谢楼上各位的支持。
    下面是提交表单后所在html页面的部分源代码:
    <BODY>
    <form id=InputForm>
    <INPUT class=txtLT value=统一编号 style="LEFT: 5px; TOP: 5px; WIDTH: 80px;" readonly style="background-color:#e7e7e7" readonly validator = none nullFlg=可空>
    <INPUT class=txtLT  id=txt_seq_no title=统一编号 style="LEFT: 85px; TOP: 5px; WIDTH: 160px;" style="background-color:#e7e7e7" maxLength=18 readonly validator = 数字型 nullFlg = 可空 >
    <INPUT class=txtLT value=报关单编号 style="BACKGROUND-COLOR: #e7e7e7; LEFT: 229px; TOP: 5px; WIDTH: 81px;" readonly validator = none nullFlg=可空>
    <INPUT class=txtLT  id=txt_entry_id title=报关单编号 style="background-color:#e7e7e7; LEFT: 310px; TOP: 5px; WIDTH: 135px;"  maxLength=9  readonly validator = none nullFlg = 可空 >
    <INPUT class=txtLT value=备案号 style="BACKGROUND-COLOR: #e7e7e7; LEFT: 435px; TOP: 5px; WIDTH: 64px;" readonly validator = none nullFlg=可空>
    <INPUT class=txtLTR  id=txt_manual_no title=备案号 style="LEFT: 485px; TOP: 5px; WIDTH: 160px;"  maxLength=12 tabIndex =0  validator = none nullFlg = 可空 >
    <INPUT class=txtLT value=申报地海关 style="BACKGROUND-COLOR: #e7e7e7; LEFT: 5px; TOP: 26px; WIDTH: 80px;" readonly validator = none nullFlg=可空>
    <INPUT class=txtLT  id=txt_custom_master title=申报地海关 style="LEFT: 85px; TOP: 26px; WIDTH: 144px;"  maxLength=4  tabIndex =1 validator = 任意型 nullFlg = 非空 >
    <INPUT class=txtLT value="出口口岸" style='BACKGROUND-COLOR: #e7e7e7; LEFT: 229px; TOP: 26px; WIDTH: 81px;' readonly validator = none nullFlg=可空>
    </form>
    </BODY>
    这个是对表单赋值的js函数:
    <SCRIPT src="../Lib/copyFromSevletToTitle.js"></SCRIPT>
    var DataValue="";
    var DataArry=new Array();
    function WriteForm() {
    if (window.opener!=null) DataValue=window.opener.top.title.BGDData.value;
    else DataValue=top.title.BGDData.value;
      DataArry=DataValue.split("||"); InputForm.txt_seq_no.value=DataArry[0];
    InputForm.txt_entry_id.value=DataArry[1];
    InputForm.txt_manual_no.value=DataArry[2];
    InputForm.txt_custom_master.value=getCodeOrCHN("DEC","TXT_I_E_PORT",DataArry[3],1,0)
    InputForm.txt_i_e_port.value=getCodeOrCHN("DEC","TXT_I_E_PORT",DataArry[4],1,0)
    InputForm.txt_contr_no.value=DataArry[5];
    InputForm.txt_i_e_date.value=DataArry[6];
    InputForm.txt_d_date.value=DataArry[7];
    InputForm.txt_bill_no.value=DataArry[8];
    }
    因为源码中没有直接的数值,我如何获取页面中的信息?谢谢 !
      

  7.   

    直接是没有办法取到的,但是楼主可以这样做,因为我这里的项目正好也有过这样的需求,我当时就是这么做的:
    看你的html中有window.opener.top.title.BGDData.value这个东西
    你可以在这里模拟发起http请求,然后再带上一个参数,值就是window.opener.top.title.BGDData.value
    再自己写个请求目的地,再进行参数解析
      

  8.   

    你可以在这里模拟发起http请求,然后再带上一个参数,值就是window.opener.top.title.BGDData.value 
    再自己写个请求目的地,再进行参数解析.
     
    您这几句说的我不是很清楚,我得场景如下:提交查询表单,然后返回查询内容。那么您说的模拟发起http请求,这个url,是查询前的地址,还是查询后返回信息的地址?这个参数值是window.opener.top.title.BGDData.value ?这样写入么?outputStream os = httpurlConnection.getOutputStream,os.writer(window.opener.top.title.BGDData.value ); os.close();感谢不吝赐教。
      

  9.   

    var xxx=$F{xxx.xxx}取不到嗎?
      

  10.   

    你是说在javascript里面实现么?
      

  11.   

    是啊,何必搞得這么復雜
    java不就是要簡單嗎
      

  12.   

    反正只要不連數據庫什么的太麻煩的業務
    你稍微寫點function也很正常啊,判斷什么的
    除非你們老大要求你一定要用這種方法
      

  13.   

    是啊
    你取得了 數據以后 放到一個隨便什么地方  比如form  或者  list 在從里面拿不行?
    ==========================
    而是js函数调用,引用了某个数组或者直接從這個數組里面拿好了。。
      

  14.   

    数据肯定也是要查出来的吧。
    就算用的JS,那也是JS发的请求去查的。
    你用JAVA模拟一个请求可以不?
      

  15.   

    尝试过用httpurlconnection进行模拟一次提交过程,但是返回来的页面的源码没有直接的表单内容而是通过调用js函数来得到数据,我用htmlparser分析是不能得到的,httpurlconnection不能解析js函数,希望大家不吝赐教。
      

  16.   

    htmlparser 不能解析js的
    httpunit 好像可以解析js
      

  17.   

    httpunit能够取到js函数中的内容?
      

  18.   

    如楼上几位说过的,你应该去看看
    window.opener.top.title.BGDData.value
    这个是怎么回事?
    你能解析那个,就可以了!
      

  19.   

    老紫竹大大,可是我怎么能拿到window.opener.top.title.BGDData.value?万分感谢!
      

  20.   

    我从流中搜出来但只是window.opener.top.title.BGDData.value,而不是值,怎样得到值呢?
      

  21.   

    没做过这种应用, JAVA 6 有解析 JAVASCRIPT 的方法, 你可以研究一下.
      

  22.   

    我倒是研究了一下java 6 中的解析javascript的方法,其中写有:scriptEngine.eval(new FileReader("http://www1.chinaport.gov.cn/rtx/Qy_I//Lib/copyFromSevletToTitle.js"));
    却报出这样的错误:java.io.FileNotFoundException: http:\www1.chinaport.gov.cn\rtx\Qy_I\Lib\copyFromSevletToTitle.js (文件名、目录名或卷标语法不正确。)
      

  23.   

    这个问题是因为filereader读的本地硬盘的数据。
      

  24.   

    需要答案 Up upup