找回密码
 加入
搜索
查看: 4725|回复: 25

请教一个切割文本内容的问题

[复制链接]
发表于 2009-10-7 19:17:36 | 显示全部楼层 |阅读模式
本帖最后由 yigao 于 2009-10-8 14:37 编辑

还是这个页面
http://ks.cn.yahoo.com/dir/vote_ans.html
AU3好像没有像AHK那样可以直接判断字符串在文本中的位置的函数。在上面页面的源文件中包含“精彩知识问答”后面的内容基本上是无用的,想先切割无用字符串后面的内容然后再进行后续操作。我现在的办法是先用filereadtoarray将文本读入,再每个测长累加找到“精彩知识问答”的位置,最后作切割。问题一是这样判断的位置不太准确,切割出来总会多一些,二是效率比较低。代码如下:
Dim $aRecords[100]
InetGet ("http://ks.cn.yahoo.com/dir/vote_ans.html","d:\My AutoIt\temp1.txt")
$file = FileRead("d:\My AutoIt\temp1.txt")
$file = BinaryToString($file,4)
_FileCreate("d:\My AutoIt\temp.txt")
FileWrite("d:\My AutoIt\temp.txt",$file)
FileDelete("d:\My AutoIt\temp1.txt")
_FileReadToArray("d:\My AutoIt\temp.txt",$aRecords)
$StringLen=0
$StringLenAll=0
For $x = 1 to $aRecords[0]
        $StringLen=StringLen($aRecords[$x])
        $StringLenAll=$StringLenAll+$StringLen
                if StringRegExp($aRecords[$x],"精彩知识问答") Then
                Msgbox(0,'Record:' & $x, $aRecords[$x])
                $file1=StringTrimLeft($file,$StringLenAll)
                msgbox(0,"",$file1)
                EndIf
Next
FileDelete("d:\My AutoIt\temp.txt")
请教有无准确切割文本内容的方法?谢谢!
另外,数组的定义究竟应该怎样才正确。我曾经用Dim $aRecords,但似乎得到的不是数组。
发表于 2009-10-7 19:56:22 | 显示全部楼层
不知道你到底要获取什么。。。例如?
 楼主| 发表于 2009-10-7 20:05:08 | 显示全部楼层
就是要获取源文件中“精彩知识问答”之前的部分内容。AU3中没有判断子字符串在字符串中位置的函数,所以在切割字符串的时候需要判断子字符串的位置。我上述的代码判断的位置不准确。
发表于 2009-10-7 20:14:08 | 显示全部楼层
"之前的部分内容"? 好多内容啊...
 楼主| 发表于 2009-10-7 21:06:58 | 显示全部楼层
是有好多。所以才需要判断StringTrimLeft中的位置
发表于 2009-10-7 22:28:59 | 显示全部楼层
StringSplit( "字符串", "分隔符", 1)

评分

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

查看全部评分

 楼主| 发表于 2009-10-8 10:46:54 | 显示全部楼层
关键是源文件内容中没有什么明显分隔符。还在考虑中!
发表于 2009-10-8 13:21:02 | 显示全部楼层
分隔符="精彩知识问答"

评分

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

查看全部评分

 楼主| 发表于 2009-10-8 14:36:23 | 显示全部楼层
这样确实可以。暂时先这样了,不知道还有没有其余的思路。
发表于 2009-10-8 15:00:19 | 显示全部楼层
其他思路 当然是用ie.au3来操作ie咯
 楼主| 发表于 2009-10-8 15:33:38 | 显示全部楼层
本帖最后由 yigao 于 2009-10-8 15:43 编辑

还是有点问题。
如果这样切割,分隔符右面的部分应该是被删除的,如果想要分隔符右面的部分而删除左面的内容怎么办?
我看操作结果数组[0]=1,数组[1]=分隔符左面部分的内容,输出数组[2]即显示超出错误,显然没有这个数组元素。

本帖子中包含更多资源

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

×
发表于 2009-10-8 18:39:26 | 显示全部楼层
11# yigao


不必弄这么复杂吧?
当然也许你对这个文本还有另外的需求。

个人以为可以如下方法简单实现关键字分隔,仅供参考。
$RUrl="http://ks.cn.yahoo.com/dir/vote_ans.html"
$RFile="c:\temp1.txt"
$WFile="c:\temp.txt"
$SpKey="精彩知识问答"
InetGet ($RUrl,$RFile)
$file = BinaryToString(FileRead($RFile),4)
FileWrite($WFile,$file)
FileDelete($RFile)
$aRecords = StringSplit(FileRead($WFile),$SpKey,1)
If $aRecords[0] = 1 Then
        ConsoleWrite("未发现分隔关键字:"&$SpKey&";全部内容如下:"&@CRLF&$aRecords[1])
Else
        ConsoleWrite("》》"&$SpKey&"之前的内容:"&@CRLF&$aRecords[1]&@CRLF&@CRLF&"###############################################################")
        ConsoleWrite("》》"&$SpKey&"之后的内容:"&@CRLF&$aRecords[2]&@CRLF&@CRLF)
EndIf
FileDelete($WFile)

评分

参与人数 1金钱 +5 收起 理由
yigao + 5

查看全部评分

 楼主| 发表于 2009-10-8 19:33:57 | 显示全部楼层
谢谢!
我运行了上面的代码,开始没有看到结果。$aRecords[0]=2。当时是不知道文本写到哪里去了?后来我加了几句msgbox,看到结果了。目前还在思考ConsoleWrite是如何实现我要求的目的的。
发表于 2009-10-8 22:30:02 | 显示全部楼层
我太杯具了  翻到11楼 就去试验 写完了才发现 原来大K已经写好了

不过我怀疑楼主更想的是这样的用途

#include <ie.au3>
$oIE = _IECreate('http://ks.cn.yahoo.com/dir/vote_ans.html')
$oGood = _IEGetObjByName($oIE, 'cate_contrib', 1)
$sText = _IEPropertyGet($oGood, "innertext")
发表于 2009-10-8 23:32:57 | 显示全部楼层
我太杯具了  翻到11楼 就去试验 写完了才发现 原来大K已经写好了

不过我怀疑楼主更想的是这样的用途

#include
$oIE = _IECreate('http://ks.cn.yahoo.com/dir/vote_ans.html')
$oGood = _IEGetObjByName($ ...
sxd 发表于 2009-10-8 22:30


更悲剧的是 yigao 同学“还在思考ConsoleWrite是如何实现我要求的目的的”。
Sxd同学,请你站起来回答 yigao同学一下,ConsoleWrite是起什么作用的?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-29 07:49 , Processed in 0.087833 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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