0

使用 Wikiepdia API 链接获取一些世界知名人物的基本信息。

示例:(关于 Dave Longaberger)

这将显示如下

关于 Dave Longaberger

现在我的问题 是我想解析 xml 以获得这样的基本信息<extract></extract>来显示它。

这是我的想法但失败了(I/O 警告:未能加载外部实体)

<?PHP
$url = 'http://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Dave Longaberger&format=xml&exintro=1';

$xml = simplexml_load_file($url);

// get extract
$text=$xml->pages[0]->extract;
// show title
echo $text;
?>

另一个想法但也失败了(未能打开流:HTTP请求失败!)

<?PHP
function get_url_contents($url){
$crl = curl_init();
$timeout = 5;
curl_setopt ($crl, CURLOPT_URL,$url);
curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($crl, CURLOPT_CONNECTTIMEOUT, $timeout);
$ret = curl_exec($crl);
curl_close($crl);
return $ret;
}

$url = "http://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Dave Longaberger&format=xml&exintro=1";

$text = file_get_contents($url);
echo $text;
?>

所以任何想法如何做到这一点。~ 谢谢

更新(添加 urlencode 或 rawurlencode 后仍然无法正常工作)

$name = "Dave Longaberger";
$name = urlencode($name);
$url = 'http://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles='.$name.'&format=xml&exintro=1';
$text = file_get_contents($url);

也不工作

$url = 'http://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Dave Longaberger&format=xml&exintro=1';
$url = urlencode($url);
$text = file_get_contents($url);

也不

$url = 'http://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles='.rawurlencode('Dave Longaberger').'&format=xml&exintro=1';
$text = file_get_contents($url);

好吧,所以我真的不知道这似乎是不可能的。

4

2 回答 2

1

在您的 curl 请求中设置用户代理标头,否则维基百科将回复错误 403 禁止。

<?PHP
$url = "http://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Dave+Longaberger&format=xml&exintro=1";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
$xml = curl_exec($ch);
curl_close($ch);

echo $xml;
?>

或者:

ini_set("user_agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
$url = "http://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Dave+Longaberger&format=xml&exintro=1";
$xml = simplexml_load_file($url);

$extracts = $xml->xpath("/api/query/pages/page/extract");

var_dump($extracts);
于 2012-05-11T16:02:46.573 回答
0

查看此 php 手册页 http://php.net/manual/en/function.file-get-contents.php中的注释

如果您要打开带有特殊字符(例如空格)的 URI,则需要使用 urlencode() 对 URI 进行编码。

于 2012-05-11T15:53:25.967 回答