【问题标题】:How to get page id from wikipedia page title如何从维基百科页面标题中获取页面 id
【发布时间】:2018-10-12 22:00:56
【问题描述】:

我正在尝试从 wikipedia 中查找页面列表的 wiki id。所以,格式是:

输入:维基百科页面标题列表

输出:维基百科页面 ID 列表。

到目前为止,我已经通过 Mediawiki API 了解如何进行,但找不到实现该功能的正确方法。谁能建议如何获取页面 ID 列表?

【问题讨论】:

    标签: python-3.x mediawiki


    【解决方案1】:

    Query basic page information:

    import requests
    
    page_titles = ['A', 'B', 'C', 'D']
    url = (
        'https://en.wikipedia.org/w/api.php'
        '?action=query'
        '&prop=info'
        '&inprop=subjectid'
        '&titles=' + '|'.join(page_titles) +
        '&format=json')
    json_response = requests.get(url).json()
    
    title_to_page_id  = {
        page_info['title']: page_id
        for page_id, page_info in json_response['query']['pages'].items()}
    
    print(title_to_page_id)
    print([title_to_page_id[title] for title in page_titles])
    

    这将打印:

    {'A': '290', 'B': '34635826', 'C': '5200013', 'D': '8123'}
    ['290', '34635826', '5200013', '8123']
    

    如果标题过多,则必须在多个请求中查询它们,因为一次可以查询的标题数量有50 (500 for bots) 限制。

    【讨论】:

      【解决方案2】:

      只要您没有非规范化标题(例如类别页面“Category:Computer_storage_devices”或 & 等特殊字符),AXO 提供的答案就有效。

      在这种情况下,您还需要将响应映射到标准化标题,如下所示:

      def get_page_ids(page_titles):
          import requests
          from requests import utils
      
          page_titles_encoded = [requests.utils.quote(x) for x in page_titles]
      
          url = (
              'https://en.wikipedia.org/w/api.php'
              '?action=query'
              '&prop=info'
              '&inprop=subjectid'
              '&titles=' + '|'.join(page_titles_encoded) +
              '&format=json')
          # print(url)
          json_response = requests.get(url).json()
          # print(json_response)
      
          page_normalized_titles = {x:x for x in page_titles}
          result = {}
          if 'normalized' in json_response['query']:
              for mapping in json_response['query']['normalized']:
                  page_normalized_titles[mapping['to']] = mapping['from']
      
          for page_id, page_info in json_response['query']['pages'].items():
              normalized_title = page_info['title']
              page_title = page_normalized_titles[normalized_title]  
              result[page_title] = page_id
      
          return result
      
      
      

      get_page_ids(page_titles = ['Category:R&J_Records_artists', 'Category:Computer_storage_devices', 'Category:Main_topic_classifications'])

      将打印

      {'Category:R&J_Records_artists': '33352333', 'Category:Computer_storage_devices': '895945', 'Category:Main_topic_classifications': '7345184'}.

      【讨论】:

        【解决方案3】:

        查询 Wikipedia API 以获取映射可能会有点耗时,因为它的使用存在一些限制。

        如果您可以下载 Wikipedia 转储并使用 wikiextractor 将其转换为 JSON 格式,那就更好了。现在,键 id 指的是 Wikipedia 页面 id,title 指的是 Wikipedia 页面标题。因此,我们一口气获得了 Wikipedia 中所有页面的映射!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多