我的问题很简单:如何在以“ 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一起使用。
答案 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.description
和response.data.query.pages[i].title
到结果对象分类
然后,我添加了一个额外的搜索字段,供用户过滤其先前的结果。如果他们输入“ episode”,它将得到我所需的信息,因为“ episode”一词通常位于页面的response.data.query.pages [i] .terms.description字段中。
唯一的缺点是此解决方案不会返回没有自己的Wiki页面的列表结果。但是为了简单起见,我会接受的。