yigao 发表于 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
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
        $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,但似乎得到的不是数组。

afan 发表于 2009-10-7 19:56:22

不知道你到底要获取什么。。。例如?

yigao 发表于 2009-10-7 20:05:08

就是要获取源文件中“精彩知识问答”之前的部分内容。AU3中没有判断子字符串在字符串中位置的函数,所以在切割字符串的时候需要判断子字符串的位置。我上述的代码判断的位置不准确。

afan 发表于 2009-10-7 20:14:08

"之前的部分内容"? 好多内容啊...

yigao 发表于 2009-10-7 21:06:58

是有好多。所以才需要判断StringTrimLeft中的位置

afan 发表于 2009-10-7 22:28:59

StringSplit( "字符串", "分隔符", 1)

yigao 发表于 2009-10-8 10:46:54

关键是源文件内容中没有什么明显分隔符。还在考虑中!

sxd 发表于 2009-10-8 13:21:02

分隔符="精彩知识问答"

yigao 发表于 2009-10-8 14:36:23

这样确实可以。暂时先这样了,不知道还有没有其余的思路。

sxd 发表于 2009-10-8 15:00:19

其他思路 当然是用ie.au3来操作ie咯

yigao 发表于 2009-10-8 15:33:38

本帖最后由 yigao 于 2009-10-8 15:43 编辑

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

KiwiCsj 发表于 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 = 1 Then
        ConsoleWrite("未发现分隔关键字:"&$SpKey&";全部内容如下:"&@CRLF&$aRecords)
Else
        ConsoleWrite("》》"&$SpKey&"之前的内容:"&@CRLF&$aRecords&@CRLF&@CRLF&"###############################################################")
        ConsoleWrite("》》"&$SpKey&"之后的内容:"&@CRLF&$aRecords&@CRLF&@CRLF)
EndIf
FileDelete($WFile)

yigao 发表于 2009-10-8 19:33:57

谢谢!
我运行了上面的代码,开始没有看到结果。$aRecords=2。当时是不知道文本写到哪里去了?后来我加了几句msgbox,看到结果了。目前还在思考ConsoleWrite是如何实现我要求的目的的。

sxd 发表于 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")

KiwiCsj 发表于 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 http://www.autoitx.com/images/common/back.gif

更悲剧的是 yigao 同学“还在思考ConsoleWrite是如何实现我要求的目的的”。
Sxd同学,请你站起来回答 yigao同学一下,ConsoleWrite是起什么作用的?
页: [1] 2
查看完整版本: 请教一个切割文本内容的问题