2

我正在使用 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''' 是 [[Savoie]] [[Departments of France|department]] 中 [[Rhône-Alpes]] [[regions] 中的 [[Communes of France|commune]]法国|地区]]在东南部[[法国]]。

它位于 [[Lac du Bourget]] 附近,{{convert|9|km|mi|abbr=on}} 位于 [[Chambéry]] 以北的铁路旁。

==History== ''Aix'' 源自 [[Latin]] ''Aquae''(字面意思是“水域”;''cf'' [[Aix-la-Chapelle]] (Aachen) 或 [[Aix -en-Provence]]),而艾克斯在[[罗马帝国]]期间是一个浴池,甚至在它被改名为“Aquae Gratianae”以纪念在不远处被暗杀的[[Emperor Gratian]]之前,在 [[里昂]],在 [[383]]。许多罗马遗迹幸存下来。[[图片:IMG 0109 Lake Promenade.jpg|thumb|left|Lac du Bourget Promenade]]

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


更新:谢谢,但我对这里有点陌生,现在我正在尝试运行 xpath 查询 [尽管是第一次],但似乎无法获得任何结果。我实际上需要在这里知道几件事。

  1. 我如何只请求文章的一部分?
  2. 如何获取所请求文章的 HTML。

我浏览了来自维基百科的关于数据挖掘的这个url - 它提出了一个想法,即使用检索到的维基百科文本作为参数向 wikipedia api 发出第二个请求,这将检索 html - 尽管到目前为止它似乎还没有工作:( -我不想把整篇文章当作一团乱七八糟的 html 来抓取并转储它。基本上我的应用程序所做的是你在地图上有一些位置和城市大头针指向 - 你点击城市标记,它会请求通过 ajax 显示城市的详细信息在相邻的 div 中。我希望从维基百科动态获取这些信息。我会担心稍后处理特定城市不存在的文章,只需要确保它在这一点上工作。

有谁知道一个很好的工作示例,它可以完成我正在寻找的工作,即阅读和解析维基百科文章的选定部分。


根据提供的 url - 它说我应该将 wikitext 发布到 wikipedia api 位置,以便它返回解析的 html。问题是,如果我发布信息,我没有得到任何响应,而是一个我被拒绝访问的错误 - 但是,如果我尝试将 wikitext 包含为 GET,它会毫无问题地解析。但是当我有太多文本需要解析时,它当然会失败。

这是维基百科api的问题吗?因为我已经破解了两天了,一点运气都没有:(

4

4 回答 4

6

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

于 2009-05-12T16:54:59.780 回答
0

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

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

于 2009-05-12T15:50:30.633 回答
0

尝试查看相关维基百科文章的可打印版本

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

$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 可能如何工作的猜测。

于 2009-05-12T15:53:17.323 回答
0

我使用了一个 PEAR Wiki Filter,它做得非常好。

文字维基

菲尔

于 2009-05-12T15:55:03.123 回答