You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

维基百科PHP API plcontinue分页失效及相关问题求助

维基百科API常见问题及PHP代码修正

一、核心问题解决:plcontinue分页重复数据

你的分页逻辑存在几个关键错误,导致返回重复内容:

  1. 赋值运算符误用:构造函数里的判断条件用了=赋值,应改为==做相等判断。
  2. formatversion不一致:第一次请求未指定formatversion=2,续页时才添加,导致参数格式不兼容,需全程统一格式版本。
  3. 数组合并未赋值:array_merge不会修改原数组,需将返回值重新赋值给变量。
  4. 仅单次续页请求:只执行了一次续页,应循环请求直到无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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:31:14