让我们以身作则。有一个网站,说它是Twitter的一个名为Tlitter的克隆。像Twitter一样,Tlitter会不断更新新内容(大多数内容只是一个垃圾,因此得名)。与twitter不同,没有JSON / XML API以方便的方式获取内容。为了从中获取数据,您必须获取旧的HTML并解析它。这是获取该内容的唯一方式。
Tlitter管理员有时会改变主意。它们可能会改变网站外观和HTML代码,从而使代码提取数据不起作用。您无法预测何时进行更改。它可以每周制作一次,每月制作一次,也可以......永远不会。
您创建了一个Android应用程序,它使用来自Tlitter的内容来补充来自其他来源的内容(比如它的推特)。 Twitter是至关重要的,并没有任何问题,因为它有一个很好的api,但Tlitter可能会让你头疼,当它停止工作。假设Twitter为您提供商店的价格,Tlitter为您提供折扣。应用程序在没有Tlitter的情况下仍然可以正常运行,但对于Tlitter来说它更好更完整。
您不想仅仅为修复每个与Tlitter相关的功能而制作新版本,因此您在Google Appspot上创建了一个应用程序,它就像您的应用程序和Tlitter之间的代理一样。如果Tlitter发生变化,您只需要更新代理应用程序,所有用户都可以再次运行。
但是,您的应用程序受到欢迎,Google改变了定价政策,为Appspot引入了“实例时间”。这两件事使您的应用程序几乎使用了所有免费配额。你不想为Appspot付费,你只需要以某种方式解决这个问题。
有多个解决方案,可能没有完美的解决方案。我问你,你怎么解决这个问题?我的想法如下:
提供的示例可能看起来很通用,但它几乎完美地模拟了我的问题。你会如何解决它?如果我找到一个很好的方法来实现它,我会选择解决方案1或3。
答案 0 :(得分:1)
大多数网站都可以使用单个正则表达式轻松解析,尤其是推特克隆。
因此,这个'结构定义文件'很容易只是一个正则表达式,具有命名的捕获组。所以我会去3。
答案 1 :(得分:1)
对于解决方案3,您可能希望查找可以更新的某种DSL或脚本语言。也许jsoup是一个很好的基础。您将加载包含选择器字符串的文件以检索该数据。在下面的示例中(来自jsoup网页),您实际上将从Web服务加载字符串(#mp-itn b a)。
Document doc = Jsoup.connect("http://en.wikipedia.org/").get();
Elements newsHeadlines = doc.select("#mp-itn b a");
Jsoup在android上直截了当。
答案 2 :(得分:0)
如果Android运行时可用于该语言,则可以使用某种动态语言(如Python)。然后,您可以经常下载最新版本的脚本。这个脚本将获得html页面(已经由你的应用程序下载)并生成一些格式良好的xml。此xml将由您的应用使用。
看看python-for-android
作为可能的路径。