从维基百科页面进行爬取和解析

5
我想知道在Objective-C中是否有任何现有的库或可访问的库可以用来抓取格式类似于此页面的网页。 具体来说,抓取每个日期以及与每个日期相邻的所有文本。如果没有,最好的方法是什么?正则表达式?我听说NSString可能已经内置了这些方法。这是真的吗?
我正在寻找是否有其他替代方案来进行抓取,例如XML文件或API。 我确实找到了一个API,但我看到的唯一客户端是其他语言,它们似乎只能向页面发布内容,而不能检索内容。
编辑:因此,我在这些链接中找到了有关API的更多信息: 并且我能够想出此请求,它返回一些HTML编码的文本(格式为XML,但包括页面的文本,例如»a href = 等)。我将继续查阅文档,以查看是否可以使其更好。如果不行,是否有任何关于解析此内容的建议?
编辑2:好的,感谢这个文档页,我能够检索到数据的最简单和最清晰的方法是使用构建的链接,它返回相关部分的原始数据(在维基标记中)。但是,我想我需要解析它,虽然如果真的是这种情况,那应该比整篇文章容易得多。
有没有人对在Objective-C中解析维基标记(如以下内容)有什么建议?
==Events==
* [[710]] – [[Saracen]] invasion of [[Sardinia]].
*[[1275]] – Traditional founding of the city of [[Amsterdam]].
*[[1682]] – [[Philadelphia]], [[Pennsylvania]] is founded.

我想最终得到的是一个类似于NSDictionary的集合,可以存储日期和相关信息片段。谢谢!
7个回答

4
在您的查询末尾添加&format=fmt,详见API:Data_formats。例如,您的查询可以变成:JSON查询。您可以指定XML、JSON或许多其他格式。
您可以轻松解析整体部分,然后将HTML格式化输出到webview中显示。

谢谢!是的,我看到了那个,但返回的文件比我能够检索到的原始文件要大得多。缺点是它是维基标记语言而不是HTML,但我并没有计划将返回的内容呈现为Web视图。我宁愿拥有实际数据,以便可以轻松地操纵其呈现方式。不过还是感谢您的回复。 - Jorge Israel Peña

3

鉴于维基百科页面以纯文本形式存储,并由用户以纯文本形式输入,因此您将无法从中获取结构化数据集。


3
我已经以各种方式从WP中爬取了大量数据。格式取决于很多因素,包括信息所在的子域类型和输入时间。主要文本是自由格式的,没有简单的方法可以进行爬取。信息框以特殊的WP格式呈现,这个格式随着时间的推移而发生了变化。它并不是为了被爬取而设计的。
WP有一个支持其后端的数据库,结构更加有序。
到目前为止,您最好的策略是联系您希望爬取的领域中的Wikipedians-他们将了解数据库格式,并可能能够提供帮助-他们肯定会想要帮助,因为他们希望看到WP以语义形式(例如DBPedia-http://dbpedia.org/About)的形式呈现。

2
Python可以吗?;)它可以从Objective-C中访问。还有一些非常好用的模块可以用于爬虫:Beautiful Soap和/或mechanize,你也可以考虑使用lxml。

1

我建议在混合HTML数据流中使用正则表达式进行有针对性的数据提取。

手机上已经有了正则表达式库,但它们有点隐藏 - 你可以使用RegexKitLite进行一些简单的调用来暴露它们(确保向下滚动并获取轻量级版本)。这最终会成为一个类,带有NSString的一些扩展,让您可以使用正则表达式,然后您将定义一个具有两个捕获匹配项的正则表达式 - 一个用于数字,一个用于内容,以及一些非捕获匹配项,用于封闭和中间标记。即使它是标准RegEX的“lite”版本,它仍支持您需要的任何功能。

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


谢谢你,我很感激。我认为我要采取的方式(我能想到的唯一方法)是获取原始数据的一部分,然后以某种方式解析它。我已经在上面包含了数据的示例,尽管我很可能会为此创建一个新问题。 - Jorge Israel Peña
那个新数据更容易解析 - 我会通过查找在“Events”之后开始的字符串范围,然后对括号内的纯数字进行匹配,以及ndash之后到行尾的任何内容进行处理... 然后你只需要剥离所有“[”和“]”字符,就可以完成了。比HTML更容易处理,因为HTML中链接非常多。 - Kendall Helmstetter Gelner
谢谢,您介意回复我有关解析的后续问题吗?http://stackoverflow.com/questions/1634012/how-to-parse-some-wiki-markup 谢谢! - Jorge Israel Peña

0

这绝对不是任何语言中的正确方式。

如果有任何网站能以一种良好的方式展示它们的数据,那就是维基百科。

尝试获取文章的XML格式,或者RDF格式,甚至是JSON格式。


这就是我所问的,是否有任何方法可以以良好的格式检索数据,但从我所看到的情况来看似乎不行。 - Jorge Israel Peña

0

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

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

个人认为这比使用正则表达式要好得多。不过,我只知道非常简单的正则表达式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接