找回密码
 加入
搜索
查看: 9637|回复: 16

[IE类操作] 这样的源码怎么提取呢?用什么函数提取 [已解决]

  [复制链接]
发表于 2014-4-7 10:06:30 | 显示全部楼层 |阅读模式
本帖最后由 101407 于 2014-4-7 16:46 编辑
            <div class="title" id="gbgc">股本构成</div>
        </div>
        <div class="Table">
            <table class='table-border th-style' width='100%'><tr><th>变更日期</th><th>变更原因</th><th>总股本(万股)</th><th>已上市流通A股</th><th>受限流通股份(万股)</th></tr><tr><td>2013-12-31</td><td></td><td>29000.00</td><td>28988.73</td><td>11.27</td></tr><tr><td>2013-06-30</td><td></td><td>29000.00</td><td>26996.73</td><td>2003.27</td></tr><tr><td>2012-12-31</td><td></td><td>29000.00</td><td>25793.00</td><td>3207.00</td></tr><tr><td>2012-12-03</td><td></td><td>29000.00</td><td>25587.46</td><td>3412.55</td></tr><tr><td>2011-12-31</td><td></td><td>29000.00</td><td>11443.46</td><td>17556.55</td></tr><tr><td>2011-06-30</td><td></td><td>29000.00</td><td>11070.64</td><td>17929.36</td></tr><tr><td>2010-12-13</td><td></td><td>29000.00</td><td>10948.20</td><td>18051.80</td></tr><tr><td>2010-12-03</td><td></td><td>29000.00</td><td>10476.30</td><td>18523.70</td></tr><tr><td>2010-03-03</td><td></td><td>29000.00</td><td>7364.10</td><td>21635.90</td></tr><tr><td>2009-12-03</td><td>新股上市</td><td>29000.00</td><td>5894.10</td><td>23105.90</td></tr><tr><td>2009-11-24</td><td>新股发行</td><td>29000.00</td><td></td><td></td></tr><tr><td>2008-12-31</td><td></td><td>21635.90</td><td></td><td></td></tr><tr><td>2007-12-31</td><td></td><td>16643.00</td><td></td><td></td></tr></table >
        </div>
    </div>

本帖子中包含更多资源

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

×
 楼主| 发表于 2014-4-7 10:56:30 | 显示全部楼层
论坛也有蛮多的例子的,也看了还是搞不了,
最好是不要下载,想用_INetGetSource读取
发表于 2014-4-7 11:14:27 | 显示全部楼层
个人建议
1,先从基础开始学
2,出50块让别人帮你把数据最出来.给源码给你自己去折腾
发表于 2014-4-7 14:54:55 | 显示全部楼层
<td>(.*?)</td>

还好楼主这个字符串相对简单。
请教一下A版,像下面这样的字符串:
<tr><td>2013-12-31</td><td></td><td>28988.73</td><td>11.27</td></tr>
<td>2013-06-30</td><td></td><td>29000.00</td><td>26996.73</td><td>2003.27</td>
<td>2012-12-31</td><td></td><td>29000.00</td><td>25793.00</td><td>3207.00</td>
<tr><td>2012-12-03</td><td></td><td>29000.00</td><td>25587.46</td><td>3412.55</td></tr>
如果只想要每行中带有<tr>..</tr>中的<td>..</td>之间的内容,上面给出的代码就只有第1、4行符合。如果是这样的,该如何写?

本帖子中包含更多资源

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

×

评分

参与人数 1金钱 +30 收起 理由
101407 + 30 非常有热心的朋友

查看全部评分

 楼主| 发表于 2014-4-7 15:04:19 | 显示全部楼层
高手来了,有代码吗,可以写到word,或ecxel吗
 楼主| 发表于 2014-4-7 15:58:34 | 显示全部楼层
本帖最后由 101407 于 2014-4-7 16:03 编辑

用A版主Au3.REHelper
提取的代码,现在问题怎么输入到Excel
### 友情提示:本脚本由 Au3.REHelper 于 2014/04/07 15:02 自动生成,不保证其正确性,请自行测试 ###
#include <Array.au3>
Local $Str = ''

$Str &= '    <!--股本构成start-->' & @CRLF
$Str &= '    <div class="box-page box-table">' & @CRLF
$Str &= '        <div class="box-header">' & @CRLF
$Str &= '            <div class="title" id="gbgc">股本构成</div>' & @CRLF
$Str &= '        </div>' & @CRLF
$Str &= '        <div class="Table">' & @CRLF
$Str &= "            <table class='table-border th-style' width='100%'><tr><th>变更日期</th><th>变更原因</th><th>总股本(万股)</th><th>已上市流通A股</th><th>受限流通股份(万股)</th></tr><tr><td>2013-12-31</td><td></td><td>29000.00</td><td>28988.73</td><td>11.27</td></tr><tr><td>2013-06-30</td><td></td><td>29000.00</td><td>26996.73</td><td>2003.27</td></tr><tr><td>2012-12-31</td><td></td><td>29000.00</td><td>25793.00</td><td>3207.00</td></tr><tr><td>2012-12-03</td><td></td><td>29000.00</td><td>25587.46</td><td>3412.55</td></tr><tr><td>2011-12-31</td><td></td><td>29000.00</td><td>11443.46</td><td>17556.55</td></tr><tr><td>2011-06-30</td><td></td><td>29000.00</td><td>11070.64</td><td>17929.36</td></tr><tr><td>2010-12-13</td><td></td><td>29000.00</td><td>10948.20</td><td>18051.80</td></tr><tr><td>2010-12-03</td><td></td><td>29000.00</td><td>10476.30</td><td>18523.70</td></tr><tr><td>2010-03-03</td><td></td><td>29000.00</td><td>7364.10</td><td>21635.90</td></tr><tr><td>2009-12-03</td><td>新股上市</td><td>29000.00</td><td>5894.10</t"
$Str &= 'd><td>23105.90</td></tr><tr><td>2009-11-24</td><td>新股发行</td><td>29000.00</td><td></td><td></td></tr><tr><td>2008-12-31</td><td></td><td>21635.90</td><td></td><td></td></tr><tr><td>2007-12-31</td><td></td><td>16643.00</td><td></td><td></td></tr></table >' & @CRLF
$Str &= '        </div>' & @CRLF
$Str &= '    </div>' & @CRLF


MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExp($str, '<td>(.*?)</td>', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($Test), '其中[0]元素为: ' & $Test[0])
_ArrayDisplay($Test, UBound($Test))
用A版主Au3.REHelper
提取的代码,现在问题怎么输入到Excel

本帖子中包含更多资源

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

×
发表于 2014-4-7 16:36:42 | 显示全部楼层

本帖子中包含更多资源

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

×
发表于 2014-4-7 17:18:13 | 显示全部楼层

本帖子中包含更多资源

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

×
发表于 2014-4-7 17:18:51 | 显示全部楼层
回复 4# haijie1223


    你这个字串暂时没有好办法, 我用的办法是:
1. 将字串拆分成行
2. 判断前4个字符是否为'<tr>'
3. 找到合规则的行之后,再调用正则 <td>(.*?)</td> 来提取.
4. 提取到的数据存入数组保存起来


#include <array.au3>
Local $str='<tr><td>2013-12-31</td><td></td><td>28988.73</td><td>11.27</td></tr>'&@LF & _
                        '<td>2013-06-30</td><td></td><td>29000.00</td><td>26996.73</td><td>2003.27</td>'&@LF & _
                        '<td>2012-12-31</td><td></td><td>29000.00</td><td>25793.00</td><td>3207.00</td>'&@LF & _
                        '<tr><td>2012-12-03</td><td></td><td>29000.00</td><td>25587.46</td><td>3412.55</td></tr>'
;按行拆分
Local $array=StringSplit($str,@LF)
;出错退出
If @error Then Exit
;定义结果数组
Local $result[1][1]
;从数据数组中逐行处理
For $i=1 To $array[0]
        ;如果行的开头不合规则  跳过
        If StringCompare(StringLeft($array[$i],4),"<tr>")<>0 Then ContinueLoop
        ;提取数据
        Local $tempArray=StringRegExp($array[$i],"<td>(.*?)</td>",3)
        ;出错跳过
        If @error Then ContinueLoop
        ;重定义数组
        ReDim $result[$i+1][UBound($tempArray)]
        ;保存提取的结果.
        For $j=0 To UBound($tempArray)-1
                $result[$i-1][$j]=$tempArray[$j]
        Next
Next
_ArrayDisplay($result,"最终结果")
发表于 2014-4-7 17:23:03 | 显示全部楼层
回复 9# lanfengc


    嗯,拆分字符串获取的方法,这个倒是比较容易,也可以先获取<tr></tr>之间的内容,再进行一次正则提取。但是觉得似乎有一步到位的正则,自己又写不出来,所以求助一下Afan,不知道他是否能看到这个贴。感谢回复~
发表于 2014-4-7 17:29:58 | 显示全部楼层
回复 6# 101407


    我看到M给我的网址了,你网络获取的源代码,用这个正则:
<tr><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td></tr>
 楼主| 发表于 2014-4-7 17:46:07 | 显示全部楼层
哈哈,谢谢了,可以了!
发表于 2014-4-7 17:48:39 | 显示全部楼层
还好楼主这个字符串相对简单。
请教一下A版,像下面这样的字符串:如果只想要每行中带有..中的..之间的内 ...
haijie1223 发表于 2014-4-7 14:54



    试试
(?i)(?!.*<tr>)<td>(.*?)</td>(?=.*</tr>)

评分

参与人数 1金钱 +50 贡献 +2 收起 理由
haijie1223 + 50 + 2 谢谢!学习!

查看全部评分

发表于 2014-4-7 20:37:00 | 显示全部楼层
回复 13# afan


    求解释.
发表于 2014-4-7 22:08:08 | 显示全部楼层
同求A大的解释,学习一下。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-17 01:59 , Processed in 0.083212 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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