找回密码
 加入
搜索
查看: 931|回复: 11

[AU3基础] 怎么正则提取网页内容【已解决】

[复制链接]
发表于 2022-7-21 12:36:57 | 显示全部楼层 |阅读模式
本帖最后由 holley 于 2022-7-22 09:47 编辑

前情:如何获取http://www.huorong.cn/downloadv5.html返回的下载地址【已解决】-已解决问题区-AUTOIT CN - Powered by Autoit中文论坛 (autoitx.com)

根据此贴得知,火绒的真实请求地址:http://www.huorong.cn/versionShow.php
{"request_type":"2","virustime":"2022-07-20","filesize":"24M","virusVersion":"2022.7.20.1","version":"5.0.69.3","createtime":"2022-07-20 18:17:53","fullName":"sysdiag-full-5.0.69.3-2022.7.20.1.exe","allName":"sysdiag-all-5.0.69.3-2022.7.20.1.exe","urlFull":"https:\/\/down7.huorong.cn\/sysdiag-full-5.0.69.3-2022.7.20.1.exe","urlAll":"https:\/\/down7.huorong.cn\/sysdiag-all-5.0.69.3-2022.7.20.1.exe"}
我的表达式:
All['"]:['"]*(\S+)["']
只能得到:
https:\/\/down7.huorong.cn\/sysdiag-all-5.0.69.3-2022.7.20.1.exe
求教:怎样才能获取到实际下载地址呢???分段截取匹配还是有其它匹配表达式?
发表于 2022-7-21 13:00:34 | 显示全部楼层
你获取的去掉\不就是?
 楼主| 发表于 2022-7-21 14:44:26 | 显示全部楼层
afan 发表于 2022-7-21 13:00
你获取的去掉\不就是?

我以为正则直接可以排除掉
请教:au3里面有什么函数或命令(我是初学者)可以过滤一下这个地址吗?
发表于 2022-7-21 16:09:58 | 显示全部楼层
holley 发表于 2022-7-21 14:44
我以为正则直接可以排除掉
请教:au3里面有什么函数或命令(我是初学者)可以过滤一下这个地 ...

你可以在你获取的基础上再 StringReplace 替换\为空即可。
当然,如果仅捕获该地址也可以直接正则替换
Local $sSource = '{"request_type":"2","virustime":"2022-07-20","filesize":"24M","virusVersion":"2022.7.20.1","version":"5.0.69.3","createtime":"2022-07-20 18:17:53","fullName":"sysdiag-full-5.0.69.3-2022.7.20.1.exe","allName":"sysdiag-all-5.0.69.3-2022.7.20.1.exe","urlFull":"https:\/\/down7.huorong.cn\/sysdiag-full-5.0.69.3-2022.7.20.1.exe","urlAll":"https:\/\/down7.huorong.cn\/sysdiag-all-5.0.69.3-2022.7.20.1.exe"}'
;~ MsgBox(0, '源字符串', $sSource)
Local $sSRERe = StringRegExpReplace($sSource, '(?i)^.+All":"(h.+?:)[\\/]+([\w.]+)[\\/]+([^"]+).+$', '\1/\2/\3')
MsgBox(0, '替换结果', $sSRERe)

评分

参与人数 2金钱 +30 贡献 +2 收起 理由
lixiaolong + 2 很给力!
holley + 30 很给力!

查看全部评分

发表于 2022-7-21 17:11:30 | 显示全部楼层
Local $sSource = '{"request_type":"2","virustime":"2022-07-20","filesize":"24M","virusVersion":"2022.7.20.1","version":"5.0.69.3","createtime":"2022-07-20 18:17:53","fullName":"sysdiag-full-5.0.69.3-2022.7.20.1.exe","allName":"sysdiag-all-5.0.69.3-2022.7.20.1.exe","urlFull":"https:\/\/down7.huorong.cn\/sysdiag-full-5.0.69.3-2022.7.20.1.exe","urlAll":"https:\/\/down7.huorong.cn\/sysdiag-all-5.0.69.3-2022.7.20.1.exe"}'
Local $str

Local $aSRE = StringRegExp($sSource, '"urlAll":"(?|(https:)\\/\\(/.*)\\(/.*?)")', 3)
If Not @error Then
        For $i = 0 To UBound($aSRE) - 1
                $str = $str & $aSRE[$i]
        Next
EndIf
MsgBox(0, '匹配', $str)

评分

参与人数 1金钱 +10 收起 理由
holley + 10 赞一个!

查看全部评分

 楼主| 发表于 2022-7-22 09:40:55 | 显示全部楼层

多谢解答,只是我这边测试结果为空。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2022-7-22 10:25:58 | 显示全部楼层
holley 发表于 2022-7-22 09:40
多谢解答,只是我这边测试结果为空。
#include <Array.au3>
Local $sSource = '{"request_type":"2","virustime":"2022-07-20","filesize":"24M","virusVersion":"2022.7.20.1","version":"5.0.69.3","createtime":"2022-07-20 18:17:53","fullName":"sysdiag-full-5.0.69.3-2022.7.20.1.exe","allName":"sysdiag-all-5.0.69.3-2022.7.20.1.exe","urlFull":"https:\/\/down7.huorong.cn\/sysdiag-full-5.0.69.3-2022.7.20.1.exe","urlAll":"https:\/\/down7.huorong.cn\/sysdiag-all-5.0.69.3-2022.7.20.1.exe"}'
;~ MsgBox(0, '源字符串', $sSource)
Local $sSRERe = StringRegExpReplace($sSource, '\\/', '/')
Local $aSRE = StringRegExp($sSRERe, '(?i)(?<=urlAll":")(.+?)(?="})', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($aSRE), '其中[0]元素为: ' & $aSRE[0])

_ArrayDisplay($aSRE, UBound($aSRE))

评分

参与人数 1金钱 +10 收起 理由
lixiaolong + 10

查看全部评分

发表于 2022-7-22 13:13:32 | 显示全部楼层
holley 发表于 2022-7-22 09:40
多谢解答,只是我这边测试结果为空。

"urlAll":"(?|(https:)\\/\\(/.*)\\(/.*?)")

你的图片上代码不对啊
发表于 2022-7-22 13:30:56 | 显示全部楼层
lixiaolong 发表于 2022-7-22 13:13
"urlAll":"(?|(https:)\\/\\(/.*)\\(/.*?)")

你的图片上代码不对啊

的确,问号变空白了,很是奇怪…
不过,这里用(?|..)重置是无意义的,可以不要
发表于 2022-7-22 13:44:27 | 显示全部楼层
afan 发表于 2022-7-22 13:30
的确,问号变空白了,很是奇怪…
不过,这里用(?|..)重置是无意义的,可以不要

谢谢提醒,我还是多学习正则吧
 楼主| 发表于 2022-7-22 13:58:18 | 显示全部楼层
lixiaolong 发表于 2022-7-22 13:13
"urlAll":"(?|(https:)\\/\\(/.*)\\(/.*?)")

你的图片上代码不对啊

再次感谢,,这样获取的跟a版结果一样
实际使用,需要将a版的改为:
Local $sSRERe = StringRegExpReplace($sSource, '(?i)^.+All":"(h.+?:)[\\/]+([\w.]+)[\\/]+([^"]+).+$', '\1/\/\2/\3')

发表于 2022-7-22 14:03:21 | 显示全部楼层
本帖最后由 afan 于 2022-7-22 14:13 编辑
holley 发表于 2022-7-22 13:58
再次感谢,,这样获取的跟a版结果一样
实际使用,需要将a版的改为:

是这样,改得好,我的漏了个/, \1//\2/\3

实际上,对于这种特征很明显的取值(最右地址),可以很简单
Local $sSource = '{"request_type":"2","virustime":"2022-07-20","filesize":"24M","virusVersion":"2022.7.20.1","version":"5.0.69.3","createtime":"2022-07-20 18:17:53","fullName":"sysdiag-full-5.0.69.3-2022.7.20.1.exe","allName":"sysdiag-all-5.0.69.3-2022.7.20.1.exe","urlFull":"https:\/\/down7.huorong.cn\/sysdiag-full-5.0.69.3-2022.7.20.1.exe","urlAll":"https:\/\/down7.huorong.cn\/sysdiag-all-5.0.69.3-2022.7.20.1.exe"}'
Local $aSRE = StringRegExp($sSource, '.+":"(.+)"', 1)
If Not @Error Then MsgBox(0, '', StringReplace($aSRE[0], '\', ''))


对于复杂的Json结构,用Json函数去取值较好,而对于这种简单的,用正则一定是首选,简单高效。

评分

参与人数 1金钱 +10 收起 理由
holley + 10 醍醐灌顶!

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-27 16:48 , Processed in 0.082110 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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