样本程式的目的是到证券之星网站取得宇通客车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
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