找回密码
 加入
搜索
查看: 3145|回复: 3

[网络通信] 批量查询web商品库存再遇正则表达式以及输出结果困难

[复制链接]
发表于 2012-3-8 14:26:21 | 显示全部楼层 |阅读模式
本帖最后由 半翅鸟 于 2012-3-8 14:38 编辑
#include <Array.au3>
#include <INet.au3>
#include<Array.au3>
Local $passnum=0
$i=InputBox("起始货号", "请输入您希望查询的起始货号的网址最后面的数字例如id=1509,请输入1509", "", " M4")
Do
  Do
  $s_URL = 'http://www.ysxyfs.com/goods.php?id='&$i
  $sText = _INetGetSource($s_URL)
  If StringRegExp($sText, 'Keywords.+content="[^"]+') Then ExitLoop
  ;检测是否为无效网址,如果是则退出当前循环。
  Local $huohao = StringRegExp($sText, '货号:(.+?)<br', 3)
  Local $colors = StringRegExp($sText, '(?s)颜色:.+?" />\s+(.+?)\s+</', 3)
  Local $size = StringRegExp($sText, '/>\s*(S|M|L|XL|XXL|均码)\s*\[(\d*|无货)\]', 3)
  FileWriteLine (@DesktopDir&"\test.txt", ""&$huohao[0]&$colors[0]&$size[0]&@CRLF)
  $passnum=0
  ;跳过的无效网址为0
  Until 1
  $i=$i+1
  $passnum=$passnum+1
Until $passnum>20
  ;如果连续跳过20个无效网址,基本就是已经没有更多商品了,可以停止。
MsgBox(4096, "已完成", "请查看桌面上查询结果.txt", 10)
网页源代码:
        商品货号:ysxy1717B<br />
                                                
        商品库存: 21 <br />
                                                                        
        <!--<a href="brand.php?id=18" ><u> </u></a>-->
        商品品牌:衣饰馨语<br />
                                                
                                                
        上架时间:2011-12-26<br />
                                                
                        
        商品点击数:1282<br />
                        用户评价: <img src="themes/BigSale/images/stars5.gif" alt="comment rank 5" /><br />
                        
                        
                        <div class="Goodpromotion">
        市场价格:<span class="market">¥358.00元</span><br />
                                                本店价:<font class="price" id="ECS_SHOPPRICE">¥299.00元</font><br />
                          
        统一标价:<font class="price" id="ECS_RANKPRICE_24">¥199.00元</font><br />
                                                                          </div>
                        
                                                
                                                                                                
                                        
                        
                        
        颜色:<br />
                        
                                                                                                <label for="spec_value_15994">
                        <input type="radio" name="spec_240" value="15994" id="spec_value_15994" checked onClick="changePrice()" />
                        黑色 
                        </label>
                        <br />
                        <input type="hidden" name="spec_list" value="0" />
                        大小:<br />
                        
                                                                                                <label for="spec_value_15995">
                        <input type="radio" name="spec_247" value="15995" id="spec_value_15995" checked onClick="changePrice()" />
                        M 
                        [9]
                                                                        </label>
                        <br />
                                                <label for="spec_value_15996">
                        <input type="radio" name="spec_247" value="15996" id="spec_value_15996"  onClick="changePrice()" />
                        L 
                        [12]
                                                                        </label>
                        <br />
                                                <input type="hidden" name="spec_list" value="1" />
问题1:由于商品衣服的尺码可能是“根本没有尺码这个内容或0个尺码到6个尺码,后面对应的库存数量可能是数字或者是“无货”,所以根据坛子里哥们们的帮助
我用了这个表达式
/>\s*(S|M|L|XL|XXL|均码)\s*\[(\d*|无货)\]
但结果不显示内容,百思不得其解,主要是水平太差了。

问题2:输出问题,尺码和对应的库存数量都是动态的,可能有1个尺码,可能有5个尺码,我怎么才能都输出在文本中呢?
在线求解决,向高手学习,这已经是我被这个程序折磨的第25天了![
发表于 2012-3-8 15:23:14 | 显示全部楼层
表示同情,我咋一直都没用过正则呢
发表于 2012-3-9 15:58:45 | 显示全部楼层
#include <Array.au3>
#include <INet.au3>
#include<Array.au3>
Local $passnum=0
$Ti=InputBox("起始货号", "请输入您希望查询的起始货号的网址最后面的数字例如id=1509,请输入1509", "", " M4")
Local $OutF="",$passnum=0
While $passnum<20
  $s_URL = 'http://www.ysxyfs.com/goods.php?id='&$Ti
  $sText = _INetGetSource($s_URL)
  If Not StringRegExp($sText, 'Keywords.+content="[^"]+') Then 
;~         Local $Array=StringRegExp($sText,"(?msi)(?>[\x{4e00}-\x{9fa5}]+:[^<&]+)|(颜色.*?)(大小.*?)(?:购买数量)",3)
        Local $Array=StringRegExp($sText,"(?ms)(货号[^<]+).*?(库存[^<]+).*?(商品品牌[^<]+).+?(上架时间[^<]+).+(本店价:)<[^>]+>([^<]+).+?(颜色.*?)(大小.*?)购买数量",3)
        Local $Output=""
        For $i=0 To UBound($Array)-1
                If StringRegExp($Array[$i],'[<>]') Then
                        $temp_Array=StringRegExp($Array[$i],'(?msi)\<label\h*for[^>]+\V\s+\<[^>]+\V\s+(.*?)\s+\<\/label\>',3)
                        Local $temp=""
                        For $k=0 To UBound($temp_Array)-1
                                $temp&=StringRegExpReplace($temp_Array[$k],'[\s]+'," ")&"  "
                        Next
                        $Array[$i]=$temp
                        $Output&=$temp&"  "
                Else
                        $Output&=$Array[$i]
                EndIf
                $Output&="|"
        Next
        $OutF&=$Output&@CRLF
        MsgBox(0,0,$OutF)
        $Ti+=1
        $passnum=0
        Else
                $passnum+=1
        EndIf
WEnd
FileWrite(@DesktopDir&"\test.txt",$OutF)
MsgBox(4096, "已完成", "请查看桌面上查询结果.txt", 10)
发表于 2012-3-10 20:01:05 | 显示全部楼层
楼主把匹配不到的现象认为是正则出错抑或程序出错,其实正则也没错,程序没错,匹配到或匹配不到二种结果都是正常现象,都是正常的信息,可以在下面的程序加以利用而达到目的。楼主程序在运行时出错是因为有的查询页面中没有“货物大小”这块内容,所以匹配不到(如id=1509等页)。这时再要程序显示变量size[0]的值当然程序出错而达不到程序的目的了。加个判断语句就行了。(如不加判断语句,一定要在正则上下功夫估计太难实现,至少你我这水平如此)。 有的查询页面(如id=1510页)没有颜色内容,我也作了相应修改。ConsoleWrite语句是调试用的,可以在scite运行窗口内看到运行结果,可以去掉的。
#include <Array.au3>
#include <INet.au3>
#include<Array.au3>
Local $passnum = 0
$i = InputBox("起始货号", "请输入您希望查询的起始货号的网址最后面的数字例如id=1509,请输入1509", "", " M4")
Do
        Do
                $s_URL = 'http://www.ysxyfs.com/goods.php?id=' & $i
                $sText = _INetGetSource($s_URL)
                If StringRegExp($sText, 'Keywords.+content="[^"]+') Then ExitLoop
                ;检测是否为无效网址,如果是则退出当前循环。
                Local $huohao = StringRegExp($sText, '货号:(.+?)<br', 3)
                ConsoleWrite("id=" & $i & ":" & $huohao[0])
                FileWrite(@DesktopDir & "\test.txt", $huohao[0])
                Local $colors = StringRegExp($sText, '(?s)颜色:<br.+?" />\s+(.+?)\s+</', 3)
                If @error = 0 Then
                        ConsoleWrite("|" & $colors[0])
                        FileWrite(@DesktopDir & "\test.txt", "|" & $colors[0])
                EndIf
                Local $size = StringRegExp($sText, '/>\s*(S|M|L|XL|XXL|均码)\s*\[(\d*|无货)\]', 3)
                If @error = 0 Then
                        For $m = 0 To UBound($size) - 1
                                ConsoleWrite("|" & $size[$m])
                                FileWrite(@DesktopDir & "\test.txt", "|" & $size[$m])
                        Next
                        
                EndIf
                ConsoleWrite(@CRLF)
                FileWrite(@DesktopDir & "\test.txt",@CRLF)
                $passnum = 0
                ;跳过的无效网址为0
        Until 1
        $i = $i + 1
        $passnum = $passnum + 1
Until $passnum > 20
;如果连续跳过20个无效网址,基本就是已经没有更多商品了,可以停止。
MsgBox(4096, "已完成", "请查看桌面上查询结果.txt", 10)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-2 19:22 , Processed in 0.084224 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表