刮擦和解析维基百科页面

时间:2009-10-27 19:56:33

标签: objective-c parsing screen-scraping wikipedia wikipedia-api

我想知道Objective-C中是否存在任何现有库或者可以从Objective-C访问哪些库,这样我就可以抓取格式为this one的页面。具体而言,所有日期和每个日期旁边的所有文本。如果没有,那么最好的方法是什么?常用表达?我听说NSString可能已经有了内置的方法。这是真的吗?

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

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

我能够提出this request返回一些HTML编码文本(格式是XML,但它包含页面的文本,例如»a href=等。我会继续浏览文档,看看我能否做到这一点好一点,如果没有,是否有解析这个的建议?

编辑2 :好的,感谢this doc page,我能够检索数据的最简单,最干净的方法是使用此constructed link返回原始数据(在wiki标记中)相关部分。但是,我想我需要解析它,但如果确实如此,它应该比整篇文章容易得多。

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

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

我想要最终得到的是,我想一个NSDictionary或类似的集合,它将使用随附的信息片段存储日期。谢谢!

7 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

鉴于维基百科上的页面以明文形式存储,并由用户以明文形式输入,因此您不会从中获取结构化数据集。

答案 2 :(得分:3)

我以各种方式从WP中删除了大量数据。格式取决于很多东西,包括信息所在的子域类型以及输入时间。主要文本是自由格式,并没有简单的方法来刮它。信息框采用特殊的WP格式,多年来一直在变化。它不是为了被刮掉而设计的。

有一个数据库支持WP,它更有条理。

到目前为止,您最好的策略是联系您想要搜索的域中的维基人 - 他们将了解数据库格式并且可能能够提供帮助 - 他们肯定会希望提供帮助他们希望以语义形式看到WP(例如DBPedia - http://dbpedia.org/About)。

答案 3 :(得分:2)

Python算了吗? ;)可从Objective-C 访问。 并且有很多用于刮擦的模块:美丽的肥皂和/或机械化,你也可以考虑lxml。

答案 4 :(得分:1)

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

手机上已有RegEx库,但它们有点隐藏 - 您可以使用RegexKitLite通过几个简单的调用来公开它们(确保向下滚动并获得简易版本)。它最终是一个在NSString上有一些扩展的类,它允许你做正则表达式,然后你将定义一个带有两个捕获的匹配的正则表达式 - 一个用于数字,一个用于内容,以及一些非捕获的匹配封闭和中间标签。即使它是标准RegEX的“精简”版本,它也只支持你需要的任何能力。

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

答案 5 :(得分:0)

这绝对不是以任何语言进行的方式。

如果任何在线网站以良好的方式公开他们的数据,它将是维基百科。

考虑将文章作为XML,RDF或甚至是JSON。

答案 6 :(得分:0)

我有一个使用以下内容进行屏幕刮擦的iPhone应用程序:

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

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