快速业务通道

Java理论与实践:用XQuery进行屏幕搜集 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
一个 DIY 的门 户网站,聚集并显示来自多个站点的数据。

用 XQuery 进行屏幕搜集

对 Web 页面做屏幕搜集的许多挑战之一是:它们通常没有可以自我标识的结 构,而且它们的结构可能随着站点内容的编辑而变化,甚至有可能根据不同的请 求,在页面中插入不同的动态内容(例如广告内容)。因此,对于页面中哪一部 分的内容与要提取的数据相对应,通常不得不进行猜测。

股票价格

现在,让我们从提取 Yahoo! 财经页面中 IBM 股票的当前价格开始 (http://finance.yahoo.com/q?s=IBM)。这个页面上有许多材料 —— 新闻标 题、广告、财经数据,等等,但是我想要的是股票的价格数据,它放在一个表格 单元格中,靠近包含“Last Trade”的单元格。清单 5 中的查询语句将选择所 有文本内容中包含“Last Trade”的 <td> 节点,然后为每个节点(希望 只有一个)输出一个包含后续 <td> 节点内容的表格行。内容是用 return 子句中的 data() 函数提取的;否则,不仅仅会得到 <td> 节点 中的文本,还会得到所有的标记。(在这个查询中,惟一包含技巧的部分是 text()[1] 这个部分;在这里,text() 函数匹配的是 <td> 元素中的所 有元素 —— 在这个例子只有一个元素,但 XQuery 并不知道这一点 —— 所以 必须进一步告诉它在进行文本匹配之前,必须选择第一个文本节点)。只要页面 包含一个表格单元格的文本是“Last Trade”,而且后续的单元格包含的是股票 价格,那么,即使页面的结构随意变化,也不会造成查询失败。

清单 5. 从 Yahoo! 财经提取股票报价的 XQuery 表达式

<table> {   for $d in //td   where contains($d/text()[1], "Last Trade")   return <tr><td> { data($d/following-sibling::td) } </td></tr> } </table>

天气

现在来试一下另外一个页面。Yahoo! 天气页面包含许多 portlet 面板,我 想提取上面所列城市的名称、温度和图标。(如果登录 Yahoo! 天气页面 http://weather.yahoo.com,则屏幕上会显示出在“我的 Yahoo!”中所选城市 的天气,否则会显示一些主要大城市的天气情况。)清单 6 显示了一个查询, 它查找包含文本“New York, NY”的子面板,然后导航到封闭表格(enclosing table),并选中所有行:

清单 6. 从 Yahoo! 天气提取天气信息的 XQuery 表达式

<table> {   for $d in //td[contains(a/small/text(), "New York, NY")]   for $row in $d/parent::tr/parent::table/tr   where contains($d/a/small/text()[1], "New York")   return <tr><td>{data($row/td[1])}</td>       <td>{data($row/td[2])}</td>       <td>{$row/td[3]//img}</td> </tr> } </table>

Java理论与实践:用XQuery进行屏幕搜集(3)

时间:2010-12-20 IBM Brian Goetz

然后,对于每一行,XQuery 会提取出三个相关的数据列 —— 城市名称、温 度和图标 —— 并输出一个相对简单的表,表中只包含这三项信息。结果就是比 较紧凑地显示了所关心城市的信息,适合在小屏幕上显示。结果如下所示:

Chicago, IL 49...63 F Java理论与实践:用XQuery进行屏幕搜集 - 编程入门网
London, UK 32...41 F Java理论与实践:用XQuery进行屏幕搜集 - 编程入门网
New York, NY 36...44 F Java理论与实践:用XQuery进行屏幕搜集 - 编程入门网
San Francisco, CA 52...67 F Java理论与实践:用XQuery进行屏幕搜集 - 编程入门网

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号