维基百科PHP API plcontinue分页失效及相关问题求助
维基百科API常见问题及PHP代码修正
一、核心问题解决:plcontinue分页重复数据
你的分页逻辑存在几个关键错误,导致返回重复内容:
- 赋值运算符误用:构造函数里的判断条件用了
=赋值,应改为==做相等判断。 - formatversion不一致:第一次请求未指定
formatversion=2,续页时才添加,导致参数格式不兼容,需全程统一格式版本。 - 数组合并未赋值:
array_merge不会修改原数组,需将返回值重新赋值给变量。 - 仅单次续页请求:只执行了一次续页,应循环请求直到无
continue参数为止。
修正后的完整代码片段:
public function __construct($constructor_params){ $this->wiki_endpoint_url = 'https://en.wikipedia.org/w/api.php'; $this->house_representatives_title = 'List of current members of the United States House of Representatives'; // 初始化时统一指定formatversion=2 $this->get_wiki_page_links_query_parameters = array( "action" => "query", "titles" => "dynamic", "prop" => "links", "pllimit" => "max", "format" => "json", "formatversion" => 2 ); // 修正判断运算符为== if($constructor_params['list'] == true && $constructor_params['genre'] == 'political'){ $this->parse_wiki_list($this->house_representatives_title); $this->parse_wiki_political_link_list(); } } private function parse_wiki_list($wiki_page_title){ $params = $this->get_wiki_page_links_query_parameters; $params['titles'] = $wiki_page_title; $all_links = array(); do { $built_url = $this->wiki_endpoint_url . '?' . http_build_query($params); echo $built_url . '<br>'; $wiki_json = $this->curl_fetch_return($built_url); $response = json_decode($wiki_json, true); // 提取当前页的链接数据 if (!empty($response['query']['pages'][0]['links'])) { $all_links = array_merge($all_links, $response['query']['pages'][0]['links']); } // 更新续页参数,无续页则移除该参数 if (!empty($response['continue'])) { $params['plcontinue'] = $response['continue']['plcontinue']; } else { unset($params['plcontinue']); } } while (isset($params['plcontinue'])); $this->wiki_json_decoded = $all_links; }
二、其他问题解决方案
1. 过滤网页中隐藏的链接
API默认返回所有内部链接,包括模板、导航栏等隐藏内容,可通过以下方式过滤:
- 添加
plnamespace=0参数:仅返回主命名空间(普通文章)的链接,排除模板、讨论页等非内容链接。 - 列表页优先用DOM解析:通过
prop=extracts获取页面HTML片段,定位到目标表格/列表后提取链接,比直接用links属性更精准。
2. iwlinks参数无效问题
iwlinks用于获取跨语言链接,不是外部URL。若要获取页面中的外部链接,需改用prop=extlinks参数,示例:
$params = array( "action" => "query", "titles" => $wiki_page_title, "prop" => "extlinks", "ellimit" => "max", "format" => "json", "formatversion" => 2 );
3. 仅获取主题相关链接
- 列表页推荐DOM解析:直接提取页面中目标表格/列表内的链接,这是最精准的方式。
- 关键词过滤:使用
plsearch参数匹配链接关键词,比如plsearch="Representative",但精度低于DOM解析。
内容的提问来源于stack exchange,提问作者Paul Tennant
相关产品推荐
相关产品推荐

