5

我想知道在 Objective-C 中是否有任何现有的库或可以从 Objective-C 访问这些库,这些库可以让我抓取像这样格式化的页面。具体来说,所有日期和每个日期旁边的所有文本。如果不是,那么最好的方法是什么?常用表达?我听说NSString可能已经为此提供了内置方法。这是真的?

我环顾四周,看看是否有任何替代抓取的方法,例如 XML 文件或 API。我确实找到了一个 API,但我看到的唯一可用的客户端是其他语言的,它们似乎只能将内容发布到页面,而不是检索它。

编辑:所以我在这些链接中找到了有关 API 的更多信息:

我能够提出这个请求,它返回一些 HTML 编码的文本(格式是 XML,但它包括页面的文本等»a href=。我​​会继续查看文档,看看我能不能把这个出来好一点,如果不是,有没有关于解析这个的建议?

编辑 2:好的,多亏了这个文档页面,我能够检索数据的最简单和最干净的方法是使用这个构造的链接,它返回相关部分的原始数据(在 wiki 标记中)。但是,我想我需要解析它,但如果确实如此,它应该比整篇文章容易得多。

是否有人对解析 wiki 标记有任何建议,例如 Objective-C 中的以下内容?

==Events==
* [[710]] – [[Saracen]] invasion of [[Sardinia]].
*[[1275]] – Traditional founding of the city of [[Amsterdam]].
*[[1682]] – [[Philadelphia]], [[Pennsylvania]] is founded.

我最终想要的是,我猜想一个NSDictionary或类似的集合将存储日期以及随附的信息片段。谢谢!

4

7 回答 7

4

&format=fmtAPI:Data_formats所述,将 a 添加到查询的末尾。例如,您的查询变为:JSON query。您可以指定 XML、JSON 或许多其他格式。

您可以轻松解析整个部分,然后将 HTML 格式的输出显示到 webview 中。

于 2009-10-27T20:49:12.153 回答
3

鉴于 Wikipedia 上的页面以明文形式存储,并且用户以明文形式输入,因此您不会从中获得结构化数据集。

于 2009-10-27T20:45:53.237 回答
3

我以各种方式从 WP 中抓取了大量数据。格式取决于很多事情,包括信息所在的子域类型以及输入时间。正文是自由格式,没有简单的方法来抓取它。信息框采用特殊的 WP 格式,多年来发生了变化。它的设计初衷不是为了刮。

有一个数据库支持 WP,它有点结构化。

到目前为止,您最好的策略是联系您希望抓取的域中的 Wikipedians - 他们会了解数据库格式并且很可能会提供帮助 - 他们肯定会希望提供帮助,因为他们希望以语义形式查看 WP(例如 DBPedia - http://dbpedia.org/About)。

于 2009-10-27T21:07:59.273 回答
2

Python 算不算?;) 它可以从 Objective-C 访问。并且有用于抓取目的的出色模块:Beautiful Soap 和/或 mechanize,您也可以考虑 lxml。

于 2009-10-27T21:09:43.890 回答
1

我将建议使用正则表达式在混合 HTML 数据流中提取目标数据。

手机上已经有 RegEx 库,尽管它们有点隐藏 - 您可以使用RegexKitLite通过几个简单的调用来公开它们 (确保向下滚动并获取精简版)。它最终成为一个在 NSString 上具有一些扩展的类,可以让您执行正则表达式,然后您将定义一个具有两个捕获匹配项的正则表达式 - 一个用于数字,一个用于内容,以及一些未捕获的匹配项封闭标签和中间标签。尽管它是标准 RegEX 的“精简”版本,但它仍然支持您需要的几乎任何能力。

API 方法很有前途,但一旦获得原始标记,您可能不得不采用类似的正则表达式方法来解析数据。如果它降低了正则表达式的复杂性和数据传输时间,它仍然是有意义的,没有理由不能结合这两种方法。

于 2009-10-27T20:45:33.923 回答
0

在任何语言中,这绝对不是这样做的方式。

如果任何在线网站会以一种很好的方式公开他们的数据,那将是维基百科。

考虑以 XML、RDF 或什至 JSON 格式获取文章。

于 2009-10-27T20:09:30.940 回答
0

我有一个 iPhone 应用程序,它使用以下内容进行屏幕抓取:

使用 YQL,您可以通过对 DOM 使用 XPATH 查询从 Web 获取所需的任何信息。

我个人认为它比使用正则表达式要好得多。再说一次,我只知道非常简单的正则表达式。

于 2009-10-28T10:54:24.160 回答