火星文 技术研习社

Noname Cat, Keep Thinking
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Flex: 抓取网页,通过 XML 获取部分内容

Posted on 2010-06-12 13:40  剑廿三  阅读(1187)  评论(0编辑  收藏  举报

样本程式的目的是到证券之星网站取得宇通客车52周和104周最高报价和最低报价。由于证券之星的网页格式不符合XML格式规范,故此不能把抓取回来的网页直接转换为 XML,需要先经过文本截取处理。Flex 利用 E4X 操作 XML 甚为方便。

 

AIR 运行效果如下图:

 

ClawTest.mxml 内容如下:

 

 

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
 3                        xmlns:s="library://ns.adobe.com/flex/spark" 
 4                        xmlns:mx="library://ns.adobe.com/flex/mx">
 5 
 6     <fx:Script>
 7         <![CDATA[
 8             
 9             // “获取”按钮点击事件
10             protected function btnGet_clickHandler(event:MouseEvent):void
11             {
12                 var request:URLRequest = new URLRequest("http://quote.stockstar.com/stock/sh_600066.htm");
13                 var loader:URLLoader = new URLLoader();
14                 loader.load(request);
15                 loader.addEventListener(Event.COMPLETE,onCompleteHandler);
16             }
17             
18             // 当网页载入完毕时触发的事件
19             private function onCompleteHandler(event:Event):void
20             {
21                 // 网页内容储存在 event.target.data 里
22                 // 这个 data 既可以被封装为 String,也可以被封装为 XML
23                 // 如果这个网页的 HTML 标记不规范、不符合 XML 格式,封装为 XML 的时候就会报错
24                 var data:String = new String(event.target.data);
25                 
26                 // 第一次截取片段
27                 var begin:int = data.indexOf("<div class=\"m_foot\">");
28                 var end:int = data.indexOf("<div class=\"m_foot_more\">");
29                 var cutdiv:String = data.substring(begin,end);
30                 
31                 // 第二次截取片段
32                 begin = cutdiv.indexOf("<table width=\"97%\" ");
33                 end = cutdiv.indexOf("</table>");
34                 var cutable:String = cutdiv.substring(begin, end+8);
35                 
36                 // 转换为 XML,如果片段内容格式不符合 XML 规范,就会报错
37                 var xml:XML = new XML(cutable);
38                 
39                 // 取得想要的内容
40                 var high52:String = xml.tr[4].td[1];
41                 var low52:String = xml.tr[4].td[2];
42                 var high104:String = xml.tr[5].td[1];
43                 var low104:String = xml.tr[5].td[2];
44                 
45                 // 呈现结果
46                 this.txtBox.text = high52 + "\n" + low52 + "\n" + high104 + "\n" + low104;            
47             }
48         ]]>
49     </fx:Script>
50 
51     <fx:Declarations>
52         <!-- 将非可视元素(例如服务、值对象)放在此处 -->
53     </fx:Declarations>
54     <s:TextArea x="95" y="49" id="txtBox" editable="true" enabled="true" width="352" height="226"/>
55     <s:Button x="237" y="318" label="获取" id="btnGet" enabled="true" click="btnGet_clickHandler(event)"/>
56 </s:WindowedApplication>
57