从维基百科获取信息 - 如何获取HTML表单?

时间:2009-05-12 15:42:57

标签: php zend-framework wikipedia

我正在使用curl从维基百科中检索信息。到目前为止,我已成功检索基本文本信息,但我真的想要用HTML检索它。

这是我的代码:

$s = curl_init();       

$url = 'http://boss.yahooapis.com/ysearch/web/v1/site:en.wikipedia.org+'.$article_name.'?appid=myID';
curl_setopt($s,CURLOPT_URL, $url);
curl_setopt($s,CURLOPT_HEADER,false);
curl_setopt($s,CURLOPT_RETURNTRANSFER,1);

$rs = curl_exec($s);

$rs = Zend_Json::decode($rs);

$rs = ($rs['ysearchresponse']['resultset_web']);

$rs = array_shift($rs);
$article= str_replace('http://en.wikipedia.org/wiki/', '', $rs['url']);

$url = 'http://en.wikipedia.org/w/api.php?';
$url.='format=json';
$url.=sprintf('&action=query&titles=%s&rvprop=content&prop=revisions&redirects=1', $article);

curl_setopt($s,CURLOPT_URL, $url);
curl_setopt($s,CURLOPT_HEADER,false);
curl_setopt($s,CURLOPT_RETURNTRANSFER,1);

$rs = curl_exec($s);
//curl_close( $s );
$rs = Zend_Json::decode($rs);

$rs = array_pop(array_pop(array_pop($rs)));
$rs = array_shift($rs['revisions']);
$articleText = $rs['*'];

然而,以这种方式检索的文本不足以显示:(它全部采用这种格式

  

'''Aix-les-Bains'''是[[Communes of   法国|公社]] [[萨瓦]]   [[法国部门|部门]]   在[[罗纳 - 阿尔卑斯]] [[地区]   法国|地区]]在东南部   [[法国]]。

     

靠近[[Lac du Bourget]],   铁路{{convert | 9 | km | mi | abbr = on}}   北[[Chambéry]]。

     

==历史=='''Aix''源于[[拉丁文]]''Aquae''(字面意思,   “水”; ''cf''[[Aix-la-Chapelle]]   (亚琛)或[[Aix-en-Provence]]),和   在[罗马人]期间,艾克斯洗澡了   帝国]],甚至在重新命名之前   ''Aquae Gratianae''以纪念   [[格拉蒂安皇帝]],是谁   被暗杀的不远处,在   [[里昂]],[[383]]。无数罗马人   仍然活着。 [[图片:IMG 0109湖   Promenade.jpg |拇指|左| Lac du   Bourget Promenade]]

如何获取维基百科文章的HTML?


更新:谢谢,但我现在对此有点新鲜,现在我正在尝试运行xpath查询[虽然是第一次]并且似乎无法获得任何结果。我实际上需要知道一些事情。

  1. 我如何只要求文章的一部分?
  2. 如何获取所请求文章的HTML。
  3. 我在维基百科的数据挖掘中经历了这个url - 它提出了一个想法,即将检索到的维基百科文本作为参数向wikipedia api发出第二个请求,这将检索html - 尽管它似乎没有到目前为止工作:( - 我不想只是抓住整篇文章作为一堆混乱的HTML并转储它。基本上我的应用程序它做的是你有一些位置和城市针在地图上指向 - 你点击城市标记,它将通过ajax详细信息请求在相邻的div中显示。我希望动态地从维基百科中获取这些信息。我会担心处理以后某个城市不存在的文章只需要确保它在这一点上起作用。

    有没有人知道我正在寻找的一个很好的工作示例,即读取和解析维基百科文章的选定部分。


    根据提供的网址 - 它说我应该将wiki文本发布到维基百科api位置,以便它返回已解析的HTML。问题是,如果我发布信息,我得不到任何响应,而是一个我拒绝访问的错误 - 但是如果我尝试将wikitext包含为GET,则它会解析没有问题。但是,当我有太多的文本需要解析时,它当然失败了。

    这是维基百科api的问题吗?因为我现在已经被黑客攻击了两天而根本没有运气:(

4 个答案:

答案 0 :(得分:6)

最简单的解决方案可能是抓取页面本身(例如http://en.wikipedia.org/wiki/Combination),然后提取<div id="content">的内容,可能使用xpath查询。

答案 1 :(得分:0)

据我了解,维基百科软件在请求页面时将Wiki标记转换为HTML。因此,使用您当前的方法,您需要处理结果。

一个好的起点是Mediawiki API。您还可以使用http://pear.php.net/package/Text_Wiki格式化通过cURL检索的结果。

答案 2 :(得分:0)

尝试查看所需维基百科文章的printable version

换句话说,更改源代码的这一行:

$url.=sprintf('&action=query&titles=%s&rvprop=content&prop=revisions&redirects=1', $article);

类似于:

$url.=sprintf('&action=query&titles=%s&printable=yes&redirects=1', $article);

免责声明:尚未经过测试,这只是猜测您的API可能如何运作。

答案 3 :(得分:0)

我使用了一个PEAR维基过滤器,它做得非常不错。

Text Wiki

菲尔