Wikipedia(API)“ List_of”页面的内容-解析为JSON

时间:2018-08-18 18:45:30

标签: javascript json node.js parsing wikipedia-api

我的问题很简单:如何在以“ List of”开头的任何维基百科页面上为所有列表项返回JSON结构?如果通过Wiki API无法实现,那么将Wiki HTML / XML解析为我所需的最佳方法是什么? (注解不一定是完美的)

大约有225,000个页面,它们似乎大部分是这四种样式之一。例如:   std::tie https://en.wikipedia.org/wiki/List_of_Star_Trek%3A_The_Next_Generation_episodes https://en.wikipedia.org/wiki/List_of_car_brands https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States

我特别希望我可以使用一些东西,例如:

#include <tuple>
bool compare (foo &a, foo &b) 
{
   return std::tie(a.num, a.s, a.something_else) < std::tie(b.num, b.s, b.something_else);
}

到目前为止,我想出的最接近的解决方案是我需要为每个部分运行的Axios Wikipedia API解析调用。此外,尽管设置了JSON参数,但我仍将列表项作为xml或HTML接收到返回JSON的“文本”属性。对于所有不同的页面类型来说,解析它都变得很困难。如果无法返回JSON,那么任何有关如何解析多个Wiki类型列表项的建议都将很有帮助。

有什么建议可以实现我的目标?我正在将VUE.js与nodejs一起使用。

  • 也许他们是一个可以提供帮助的图书馆?
  • 也许对URL的获取请求以获取完整的html转储会更好?
  • 也许它们只是我可以解析到Firestore的列表页面的Wikidump?

1 个答案:

答案 0 :(得分:1)

Wiki数据的概念解决了这个问题,但是,在成熟度水平附近仍然无法提供很多价值。在大约3-5年内,可以完全避免此问题。

这时,回答此问题的快速而又肮脏的方法只是通过api获取给定维基百科页面上的所有链接,然后以编程方式进行过滤或让用户这样做。之所以可行,是因为给定列表上的绝大部分星际迷航情节,总裁和汽车品牌都将链接到各自的维基百科页面。

我使用以下API查询来获取维基百科页面上的所有链接(使用pageid)

    axios({
      method: 'get',
      url: 'https://en.wikipedia.org/w/api.php',
      params: {
        action: 'query',
        format: 'json',
        prop: 'pageterms|pageimages',
        origin: '*',
        generator: 'links',
        gpllimit: '500',
        redirects: 'true',
        pageids: pageidIn,
        piprop: 'thumbnail',
        formatversion: 2
      }

然后保存response.data.query.pages[i].terms.descriptionresponse.data.query.pages[i].title到结果对象分类

然后,我添加了一个额外的搜索字段,供用户过滤其先前的结果。如果他们输入“ episode”,它将得到我所需的信息,因为“ episode”一词通常位于页面的response.data.query.pages [i] .terms.description字段中。

唯一的缺点是此解决方案不会返回没有自己的Wiki页面的列表结果。但是为了简单起见,我会接受的。