feicuiboy 发表于 2010-4-8 23:54:38

(已解决)《afan大哥再次帮忙》读取网页源代码中的随机数,判断后自动下载保存?

本帖最后由 feicuiboy 于 2010-4-16 07:24 编辑

网页部分代码如下:
   
   search.jsp?id=15d456&door=4A123456&uf8=true(door=的后面为随机数)
   search.jsp?id=15d456&door=4A456789?&uf8=true(door=的后面为随机数)
   search.jsp?id=15d456&read=4A658458&uf8=true   (read=的后面为随机数)
   
现在想做的是
若存在door= 这个字符串,则对比door后面的数字 123456和456789哪个大,哪个数大就自动访问哪个链接(这里456789比123456大,所以访问 search.jsp?id=15d456&door=4A456789?&uf8=true ),并获取这个网页的源代码。
   若不存在door= 字符串,则访问 search.jsp?id=15d456&read=4A658458&uf8=true,并获取其源代码。


最困惑我的
第一个:是door=4A123456的随机数如何逐个获取?

第二个:是知道了下载地址,比如http://abc.com/258.exe,如何自动保存(文件名和原文件名一样,也是258.exe)


请高手指点,谢谢

afan 发表于 2010-4-9 00:30:05

LZ想批量下载论坛文章或附件,鉴定完毕。
可以试试搜索 Teleport Pro ……

tianya1631 发表于 2010-4-9 00:38:49

回复 2# afan
呵呵,Afan版主啥都懂啊,佩服!那个中文名应该叫做网站整站下载器吧,用过还不错。。

feicuiboy 发表于 2010-4-9 00:40:08

回复 2# afan

我知道Teleport Pro是下载网页的,
由于我的工作是每天需要从内网更新一些资料,而那个网站需要多次的跳转,
也就是一个软件有几个版本,我需要多次点击才能下载到最新的,我想直接输入一个资料名称,即可自动下载保存,这样可提高工作效率,期盼高手指点一下

afan 发表于 2010-4-9 00:57:56

本帖最后由 afan 于 2010-4-9 01:08 编辑

$Str = _
                'search.jsp?id=15d456&door=4A123456&uf8=true' & @CRLF & _
                'search.jsp?id=15d456&door=4A456789?&uf8=true' & @CRLF & _
                'search.jsp?id=15d456&read=4A658458&uf8=true '
MsgBox(0, '源码', $Str)
$sR = StringRegExp($Str, '(.+door=.+?(\d+)[^\d].+)', 3)
Dim $zMax = 0, $lj = ''
For $i = 1 To UBound($sR) - 1 Step 2
        If Number($sR[$i]) > $zMax Then Local $zMax = $sR[$i], $lj = $sR[$i - 1]
Next
MsgBox(0, $zMax, $lj);
下载就简单了InetGet('http://abc.com/258.exe')

feicuiboy 发表于 2010-4-9 01:21:12


$Str = _
                'search.jsp?id=15d456&door=4A123456&uf8=true' & @CRLF & _
                'search.jsp?id=15d456&door=4A456789?&uf8=true' & @CRLF & _
                'search.jsp?id=15d456&read=4A658458&uf8=true '
MsgBox(0, '源码', $Str)
$sR = StringRegExp($Str, '(.+door=.+?(\d+)[^\d].+)', 3)
Dim $zMax = 0, $lj = ''
For $i = 1 To UBound($sR) - 1 Step 2
      If Number($sR[$i]) > $zMax Then Local $zMax = $sR[$i], $lj = $sR[$i - 1]
Next
MsgBox(0, $zMax, $lj)


afan大哥,还有些不明白。
其中的$sR = StringRegExp($Str, '(.+door=.+?(\d+)[^\d].+)', 3)这句正则是什么意思啊?另外$sR = StringRegExp($Str, '(.+door=.+?(\d+)[^\d].+)', 3)中返回值是“返回全局匹配的数组”,for循环为什么步数为2?

afan 发表于 2010-4-9 01:37:29

正则的注释…… 麻烦就一个字

(.+door=.+?(\d+)[^\d].+)有效的大组里面嵌套了一个有效的小组,这就将输出一组整行字符串和一组其中的数字字符串。\d代表一个数字。+号代表前面的东东有1个以上,所谓贪婪模式。?号前面如果是+或*则是懒惰模式,匹配尽可能少的字符。
一言难尽……
http://deerchao.net/tutorials/regex/regex.htm

step 2 是因为输出的数组元素是 整行、数字、整行、数字……这样递增的,比大小只要数字,所以步进为2

lpxx 发表于 2010-4-9 09:43:29

张宇说过,一言难尽……忍不住伤心....

feicuiboy 发表于 2010-4-9 16:30:54

本帖最后由 feicuiboy 于 2010-4-9 16:33 编辑

最近在思考做一个自动下载最新版本软件的方法,由于我的内网上某一软件多次更新,有多个版本,输入软件名后有多个下载链接,最新的软件epm.EPMDocument后面跟的数字会比较大,需要下载最新版本来使用

我的思路是获取网页源代码内的所有地址,然后对比epm.EPMDocument后面跟的最大的数字,获取该数字对应的链接,然后用InetGet下载。现在需到的问题是正则表达式。自己昨天看了下,还是没能很明白


源代码如下:
=========================源代码开始=====================================
title="显示 K 文档详细信息页面" alt="显示 K 文档详细信息页面"/></a></TD><TD></TD></TR>
</TABLE></td><td><a href="javascript:openForeignWindow('netmarkets/jsp/object/more.jsp?oid=VR%3Awt.epm.EPMDocument%3A12345678&u8=1','$DCA$_POPUP_OPTION,width=350,height=475,

若干其他代码

title="显示 K 文档详细信息页面" alt="显示 K 文档详细信息页面"/></a></TD><TD></TD></TR>
</TABLE></td><td><a href="javascript:openForeignWindow('netmarkets/jsp/object/more.jsp?oid=VR%3Awt.epm.EPMDocument%3A45678912&u8=1','$DCA$_POPUP_OPTION,width=350,height=475,

若干其他代码

title="显示 K 文档详细信息页面" alt="显示 K 文档详细信息页面"/></a></TD><TD></TD></TR>
</TABLE></td><td><a href="javascript:openForeignWindow('netmarkets/jsp/object/more.jsp?oid=VR%3Awt.epm.EPMDocument%3A55555555&u8=1','$DCA$_POPUP_OPTION,width=350,height=475,

==========================源代码结束================================


也就是很有规律的,在,'$DCA$_POPUP_OPTION,width=350,height=475,
前面的就是所要的链接地址《/jsp/object/more.jsp?oid=VR%3Awt.epm.EPMDocument%3A45678912&u8=1'》,这个地址可能是1个,也可能是15个,看了下正则表达式语法,自己写了一个,但是测试无法读取的。

问题是:如何去读取这些散步在源代码中的地址,提取最大数者对应的链接。希望afan大哥再次帮忙,

afan 发表于 2010-4-9 18:17:03

回复 9# feicuiboy #include <Array.au3>
$Str = _
                'title="显示 K 文档详细信息页面" alt="显示 K 文档详细信息页面"/></a></TD><TD></TD></TR>' & @CRLF & _
                '</TABLE></td><td><a href="javascript:openForeignWindow(' & "'" & 'netmarkets/jsp/object/more.jsp?oid=VR%3Awt.epm.EPMDocument%3A12345678&u8=1' & "'" & ',' & "'" & '$DCA$_POPUP_OPTION,width=350,height=475,' & @CRLF & _
                '' & @CRLF & _
                '若干其他代码' & @CRLF & _
                '' & @CRLF & _
                'title="显示 K 文档详细信息页面" alt="显示 K 文档详细信息页面"/></a></TD><TD></TD></TR>' & @CRLF & _
                '</TABLE></td><td><a href="javascript:openForeignWindow(' & "'" & 'netmarkets/jsp/object/more.jsp?oid=VR%3Awt.epm.EPMDocument%3A45678912&u8=1' & "'" & ',' & "'" & '$DCA$_POPUP_OPTION,width=350,height=475,' & @CRLF & _
                '' & @CRLF & _
                '若干其他代码' & @CRLF & _
                '' & @CRLF & _
                'title="显示 K 文档详细信息页面" alt="显示 K 文档详细信息页面"/></a></TD><TD></TD></TR>' & @CRLF & _
                '</TABLE></td><td><a href="javascript:openForeignWindow(' & "'" & 'netmarkets/jsp/object/more.jsp?oid=VR%3Awt.epm.EPMDocument%3A55555555&u8=1' & "'" & ',' & "'" & '$DCA$_POPUP_OPTION,width=350,height=475,'

;Msgbox(0, 0, $str)
$sR = StringRegExp($Str, "netmarkets(.+)','\$DCA\$_POPUP_OPTION", 3)
_ArrayDisplay($sR, '')

feicuiboy 发表于 2010-4-9 23:33:59

回复 5# afan
:face (25):


对$sR = StringRegExp($Str, '(.+door=.+?(\d+)[^\d].+)', 3) 的解释,

对正则表达式理解:
'(.+door=.+?(\d+)[^\d].+)'-------------------------------由以下部分组成:一个以上字符串   +door=   一个或以上尽可能少的字符串   一个以上的数字一个以上非数字的字符串组成

对$sR = StringRegExp($Str, '(.+door=.+?(\d+)[^\d].+)', 3)的结果: 描述为返回全局匹配的数组,数组0为匹配之整体字符串,数组1为匹配为搜索到的匹配(这里返回的为什么会是数值,迷惑)

afan 发表于 2010-4-9 23:38:35

返回的就是 (\d+) 的内容

feicuiboy 发表于 2010-4-16 07:22:40

结贴,谢谢afan..

boyhong 发表于 2010-4-16 09:37:28

在几次afan大大的帮助下,我已会使用简单的基本的正则了。。。。。对他我内心是无比的感谢..一切尽在不言中。。。

gapkiller 发表于 2010-4-16 09:44:49

正则的注释…… 麻烦就一个字

(.+door=.+?(\d+)[^\d].+)有效的大组里面嵌套了一个有效的小组,这就将输 ...
afan 发表于 2010-4-9 01:37 http://www.autoitx.com/images/common/back.gif


    好吧,我承认我是来找茬的, "麻烦"貌似是两个字
页: [1] 2
查看完整版本: (已解决)《afan大哥再次帮忙》读取网页源代码中的随机数,判断后自动下载保存?