找回密码
 加入
搜索
楼主: xpban2006

怎样提取这段字符啊?谢谢![送100金]

 火.. [复制链接]
 楼主| 发表于 2009-12-22 12:55:20 | 显示全部楼层
发表于 2009-12-22 14:05:37 | 显示全部楼层
Dim $url="http://www.weather.com.cn/weather/101121301.shtml" 
;这个是把网页全部代码写入temp.exe文件内
InetGet($url,'test.txt',0,0)
;这个是冲temp.exe文件内读取全部代码.
$HTMLContents=FileRead('test.txt')
发表于 2009-12-22 14:09:21 | 显示全部楼层
其实很简单的,按楼主思路给个提示,把换行符给替换掉吧
$sHTML=StringRegExpReplace ($sHTML, "\r\n", "")
发表于 2009-12-22 14:10:33 | 显示全部楼层
类似问题还有
源文件位 unix格式 UTF-8编码 等等
发表于 2009-12-22 14:41:06 | 显示全部楼层
$Str = '              <a href="http://www.weather.com.cn/static/html/knowledge/20090616/5742.shtml" target="_blank">' & @CRLF & _
'                3-4级' & @CRLF & _
'              </a>'
Msgbox(0, '源码', $str)
$sR = StringRegExp($str, 'blank">\s+(.+)级\s+</a>', 3)
If @error = 0 Then MsgBox(0, '匹配', $sR[0])
发表于 2009-12-22 14:45:29 | 显示全部楼层
如果不行那就是你获取到的源码有问题,那得细说如何获取的
发表于 2009-12-22 15:15:11 | 显示全部楼层
本帖最后由 sanmoking 于 2009-12-23 14:35 编辑

写了个小代码,下面这个楼主研究一下哈..估计能帮到你..
哈哈,特别是那几个func比之前的代码改进很多.......

下面是个获取七天天气的例子,貌似我获取出来的是8天???汗,总之是把页面上的天气信息都获取出来......仔细研究代码吧.....
特别是里面用到关键词的地方,那个关键词的选择是得仔细分析的.....
#include <IE.au3>
$oIE= _IECreate ("http://www.weather.com.cn/weather/101121301.shtml", 0);打开页面
$html = _IEDocReadHTML ($oIE);读取源码

for $day = 1 to amount($html,'class=t0');查询有多少天的天气信息
$ok=StringInStr($html,'class=t0',0,$day);得到第几天数据开始的位置
$aa1 = chzn(ies($html,'class=t0',"TD>",$ok));获取当前日期
$aa2 = chzn(ies($html,$aa1,"</TABLE>",$ok),1);获取今天的天气内容并提取汉字部分
$aa3 = "";这个用来合并上边提取到的汉字数组
for $i = 1 to UBound($aa2)
$aa3 = $aa3 & $aa2[$i-1]&@CRLF;每个词组之间加上个换行
Next 
$aa4 = ies($html,'高温 <STRONG>',"<STRONG>",$ok);因为温度部分是专门的数字,所以汉字提取的时候没有提取到,现在专门提取一下这个值
$aa5= StringReplace (StringReplace ($aa3, @CRLF&"℃",""), "高温", "高温"&$aa4&"℃");添加上温度并替换掉多余的那个摄氏度符号
$aa6 = ies($html,'低温 <STRONG>',"<STRONG>",$ok)
$aa7= StringReplace (StringReplace ($aa5, @CRLF&"℃",""), "低温", "低温"&$aa6&"℃")
$aa8= StringReplace ($aa7, "夜间", @CRLF&"夜间");夜间之前加个换行..
MsgBox(0,"结果","【"&$aa1&"】的天气如下:"&@CRLF&$aa8) ;显示结果
next


;~ 下上边用到了以下三个简单的func,对于搜索网页源码的工具是很有用的哦,虽然功能简单,原理没有技术含量,但也算是我原创的啦。
func ies($data,$a,$b,$s = 1,$c = 1);查找$a$b之间的文字,$a = 前面的关键词,$b=后边的关键词,$s = 从哪里开始查询 ,默认从$data最开始,$c = 查询第几个,默认为1
$start = StringInStr ($data, $a,0,$c,$s)+StringLen ($a);查找$a的结束位置
$end = StringInStr ($data,$b,0,1,$start);从$a的结束位置开始查找$b的位置
$amount = $end - $start;获得中间部分字符的数量
$txt=StringMid ($data, $start, $amount);得到中间部分的字符
Return $txt ;返回结果
EndFunc

Func chzn($txt,$RE = 0);提取出来汉字部分,$re = 0,只返回数组里的第一个值,$re = 非0,返回整个数组
;~ $ch = StringRegExp($txt, '[^\x00-\xff]+', 3);用了正则,论坛里搜的。。纯提取汉字,比如 [<td>23日星期三</td>]可以提取出来[日星期三],没有23
$ch = StringRegExp($txt, '([^>]*[^\x00-\xff]+[^<]*)', 3);可以提取到汉字前面、>后边的文字,比如 [<td>23日星期三</td>]可以提取出来[23日星期三]
If @Error = 0 Then 
IF $RE = 0 Then
Return $ch[0];返回结果,这个仅仅返回第一个汉字组合,如果相反会所有的请用下面这句,将返回一个数组。
Else
Return $ch;将返回整个数组。
EndIf
endif
EndFunc

func amount($data,$txt);返回$data一共有多少个$txt,没有考虑最大字节数..貌似会有限制...
$am = 0 
while 1 
$ok=StringInStr ($data,$txt,0,$am + 1)
If $ok > 0 Then
$am = $am + 1
Else
ExitLoop
EndIf 
wend
Return $am 
EndFunc






为了来这里的朋友更好的去理解我上边的func代码,再放一段源码,用来获取本论坛主页上热门主题的信息....
;有的时候不想调用ie打开网页,直接下载页面也是个很好的选择
$file=InetGet('http://www.autoitx.com/index.php',@TempDir & "\text.txt",1);保存网页到临时文件
If $file Then $file=FileOpen(@TempDir & "\text.txt",0);打开下载的文件
If $file <> -1 Then $html = FileRead($file);读取文件源码
FileClose($file);关闭打开的文件
FileDelete(@TempDir & "\text.txt");删除临时文件
$news = ies($html,'<h4 id="homegrids_t_1">','</ul></div>');截取出来热门主题部分的源码,便于后边的识别
;$news = ies($html,'<h4 id="homegrids_t_2">','</ul></div>');改这一句就变成截取出来[最新主题]了
;$news = ies($html,'<h4 id="homegrids_t_3">','</ul></div>');[最新回复]么?我没测试...关键就是那个从哪里开始的关键词

$aaa = "";放个容器来盛咱们获取到的信息...
for $ti = 1 to amount($news,'<li>');查询有多少个主题条目,一般情况下就是8个喽,你可以直接1 to 8 好了
$ok=StringInStr($news,'<li>',0,$ti);得到第$ti条数据开始的位置
$aa1 = ies($news,"title='","' target",$ok);获取当前标题
$aa2 = ies($news,"target='_blank'>","</a></span>",$ok);获取对应作者
$aa3 = "["&$ti&"] "&$aa1 &" 【作者:"& $aa2&"】";整合出来结果[编号]题目【作者】
$aaa = $aaa & $aa3 &@CRLF;每次循环后把结果附加到之前结果的后边...
next
MsgBox(0,"结果","【热门主题】的条目如下:"&@CRLF&"--------------------------------------------"&@CRLF&$aaa) ;显示结果

;~ 上边用到了以下两个简单的func,在网页内容搜索中很有用的哦,虽然原理很简单,但是都是我本人原创的哦,..
func ies($data,$a,$b,$s = 1,$c = 1);查找$a $b两个关键词之间的文字,$a = 前面的关键词,$b=后边的关键词,$s = 从哪里开始查询 ,默认从最开始,$c = 查询第几个,默认为1
$start = StringInStr ($data, $a,0,$c,$s)+StringLen ($a);查找$a的结束位置
$end = StringInStr ($data,$b,0,1,$start);从$a的结束位置开始查找$b的位置
$amount = $end - $start;获得中间部分字符的数量
$txt=StringMid ($data, $start, $amount);得到中间部分的字符
Return $txt ;返回结果
EndFunc

func amount($data,$txt);返回$data(文本)中一共有多少个$txt(搜索词),此func没有考虑最大字节数..貌似会有限制...
$am = 0 ;起始数量为0
while 1 ;无限循环开始
$ok=StringInStr ($data,$txt,0,$am + 1);搜索关键词,从第一个开始,每次循环加1,所以$am + 1
If $ok > 0 Then;如果找到的话
$am = $am + 1;数量加1
Else;否则
ExitLoop;退出这个循环搜索
EndIf
wend ;结束循环
Return $am ;返回搜索到的数量
EndFunc










说了半天还没有正面回答楼主的问题哈哈,下面就是答案,当然了,是用我的func来解决的啦.....
 ;有的时候不想调用ie打开网页,直接下载页面也是个很好的选择
$file=InetGet('http://www.weather.com.cn/weather/101121301.shtml',@TempDir & "\text.txt",1);保存页面到临时文件
If $file Then $file=FileOpen(@TempDir & "\text.txt",128);打开下载的文件,128=用UTF8模式读写
If $file <> -1 Then $html = FileRead($file);读取文件源码
FileClose($file);关闭打开的文件
FileDelete(@TempDir & "\text.txt");删除临时文件
;上边是下载源码部分

$news = ies($html,'<!--day 1-->','</tr>');先提取出 day 1 的天气部分的源码,下一步再从里面筛选,关键词的选择需要仔细看下源码才能定下来
$feng = ies($news,'风','级')&"aaii";提取出风级部分的源码,后边随便加了个补充的字符串是为了下边用
$ji = ies($feng,'"_blank">','aaii');结果出来了,哈哈
$ji=StringStripWS ($ji, 8) ;删除一下空白
MsgBox(0,"结果","得到的结果是:["&$ji&"]级") ;显示结果

;或者用下面这一句就好了
$ji = ies(ies($html,'<!--day 1-->','</tr>'),'"_blank">','级',1,5);从第一个字符后边的第5个"_blank">开始算...有点绕口,逻辑性没错....
$ji=StringStripWS ($ji, 8) ;删除一下空白
MsgBox(0,"结果","第二次得到的结果还是:["&$ji&"]级") ;显示结果

;~ 下面是提取前后两个关键词中间部分的一个Func,在网页内容搜索中很有用的哦,虽然原理很简单,但是是我本人原创的哦,..
func ies($data,$a,$b,$s = 1,$c = 1);查找$a $b两个关键词之间的文字,$a = 前面的关键词,$b=后边的关键词,$s = 从哪里开始查询 ,默认从最开始,$c = 查询第几个,默认为1
$start = StringInStr ($data, $a,0,$c,$s)+StringLen ($a);查找$a的结束位置
$end = StringInStr ($data,$b,0,1,$start);从$a的结束位置开始查找$b的位置
$amount = $end - $start;获得中间部分字符的数量
$txt=StringMid ($data, $start, $amount);得到中间部分的字符
Return $txt ;返回结果
EndFunc



afan太抠啦,此办法可解决大部分网页获取的问题.有时候甚至比正则都好用伐..这么帅的想法也不多给点...

本帖子中包含更多资源

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

×

评分

参与人数 1金钱 +80 贡献 +20 收起 理由
afan + 80 + 20 整出来发到udf区吧

查看全部评分

发表于 2009-12-22 15:46:09 | 显示全部楼层
是读取UTF-8格式的问题吧。
dim $str
$file=InetGet('http://www.weather.com.cn/weather/101121301.shtml',@TempDir & "\text.tmp",1)
If $file Then $file=FileOpen(@TempDir & "\text.tmp",128)
If $file <> -1 Then $str = FileRead($file)
FileClose($file)
FileDelete(@TempDir & "\text.tmp")
$array = StringRegExp($str, '<[^<]*a[^>]*>[^\d]*(.+)级[^S]*<[^<]*/a[^>]*>', 1)
if not @error Then MsgBox(0, "风力?", $array[0])

评分

参与人数 1金钱 +60 收起 理由
xpban2006 + 60 谢谢啊!

查看全部评分

发表于 2009-12-23 08:12:34 | 显示全部楼层
通过网页汲取数据使用IEBodyReadHTML($_oIE)不容易乱码,作业时最好输出到本地文本查看格式,如果存在格式符号,最好使用StringStripCR StringStripWS两函数在不影响输出数据读取的情况下删除格式符。
 楼主| 发表于 2009-12-23 10:23:09 | 显示全部楼层
回复 17# 水木子


    这个我已经试过了,不行,现在总是找不到天气那个,用你发的正则测试工具都可以找到,但用网页的代码截取就不行,就是天气"晴"“多云”那个,总是找到第二天的,真得很奇怪~~

因这个网页用的utf8,我用的转换函数ansi的了,才可以截到,要不然是乱码。
 楼主| 发表于 2009-12-23 10:25:31 | 显示全部楼层
回复 19# bob


    的确有这个问题,它这个是utf8格式,我转成ansi了才截到。
 楼主| 发表于 2009-12-23 10:27:33 | 显示全部楼层
回复 22# sanmoking


    谢谢,看来我的钱是省不了了,真是高手,这个得我消化好几天:)
 楼主| 发表于 2009-12-23 10:30:03 | 显示全部楼层
回复 23# Amu


    的确,用你的第一天可以弄到啊,不错,研究下。
发表于 2009-12-23 13:45:09 | 显示全部楼层
22楼更新了一下,关注这个帖子的可以继续关注,感谢你的关注...
发表于 2010-3-30 03:17:20 | 显示全部楼层
#include<IE.au3>
$oIE = _IECreate("http://weather.news.qq.com/inc/ss296.htm", 1, 0)
$sHTML = _IEBodyReadText($oIE)
MsgBox(0,0,$sHTML)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-18 19:06 , Processed in 0.091519 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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