维基百科api呼吁页面上的特定内容

时间:2015-04-23 22:51:51

标签: api wikipedia

如何进行维基百科API调用以获取此页面上的前5个机场名称,位置和国家/地区?

http://en.wikipedia.org/wiki/List_of_the_world%27s_busiest_airports_by_passenger_traffic

1 个答案:

答案 0 :(得分:1)

在这里你可以看到你需要改进的所有json:

http://en.wikipedia.org/w/api.php?format=jsonfm&action=query&titles=List_of_the_world's_busiest_airports_by_passenger_traffic&prop=revisions&rvprop=content

仅针对?format=jsonfm更改?format=json,您将获得有用的数据。

解决方案:

通过在linux上执行此命令,您将获得所有列表的行:

curl http://en.wikipedia.org/w/api.php?format=json\&action=query\&titles=List_of_the_world\'s_busiest_airports_by_passenger_traffic\&prop=revisions\&rvprop=content | sed 's|\\u||g' | grep -onE '\\n\|[0-9]+\.\|\|[^\\]*'

输出中提示的每一行都是排名顺序的每个机场(每个列表30个或50个机场,具体取决于列表)。

此命令会在没有任何其他内容的情况下提示其名称:

curl http://en.wikipedia.org/w/api.php?format=json\&action=query\&titles=List_of_the_world\'s_busiest_airports_by_passenger_traffic\&prop=revisions\&rvprop=content | sed 's|\\u||g' | grep -onE '\\n\|[0-9]+\.\|\|[^\\]*' | grep -onE '} \[\[[^[\]*]' | sed 's/[\[|:}]//g; s/]]//; s/[0-9][0-9]*//g; s/ //' 

注意:所有页面的列表都是连接的,所以最后一个列表实际上不是数字600,但前30个是它的实数,每个30或50(取决于你的列表)正在查看)有一个不同的列表。

说明:

我从here获取了url端点,然后使用curl对维基百科的API进行GET请求,该API获取您请求的页面上的所有可用数据,然后我使用正则表达式进行解析所需的价值观。我正在使用的正则表达式是:

sed 's|\\u||g' 
  

这个由sed(流编辑器)执行,它的作用是什么   搜索\u的每个外观(代表unicode)   字符)并删除它。我需要这样做,因为稍后我将使用字符串'\n'(代表新行)作为行的分隔符。   我所说的方式就是使用s的命令sed   用于替换字符串\u的每个外观,以及存在的原因   两个反斜杠是因为它需要被转义或者它将被解释为命令的一部分。

grep -onE '\\n\|[0-9]+\.\|\|[^\\]*'
  

这个正则表达式由grep执行,我们做的第一个(作为   之前提到的)是匹配任何新的行\n,再次,我们   需要逃避反斜杠。然后我们需要匹配字符|和   它也需要逃脱。然后我们需要匹配任意数量的数字[0-9]+ []内的所有内容都是字符,0-9是我们想要匹配的范围,+代表一个或多个,我们还希望角色.也需要转义,然后再转发两次这个角色:|。此时我们已经匹配了索引,现在我们希望匹配每个字符直到行尾,这将是'\ n',但由于我们已经删除了无用的\u,所有的反斜杠左边是新行,所以,这里是我们需要的匹配:[\\],但是我们想要否定它,这就是为什么我们在反斜杠前添加^,然后是{{ 1}}将匹配零个或多个不是反斜杠的未知字符。正则表达式前面的*是传递给grep的选项,其含义为-onEo = only matchn = number each line

E = extended regular expression
  

此时我们所有行都包含每个行中的所有可用数据,我们只想获取grep -onE '} \[\[[^\]*]]' 中包含的名称,并始终在[[...]]之后,这是和以前一样,但我们不想要的时间是}而不是]

\
  

这个sed命令唯一能做的就是删除所有非字母字符,方法是将它们分组在sed 's/[\[|:}]//g; s/]]//; s/[0-9][0-9]*//g; s/ //' 中,并用什么来代替它们。也许这不是更有效的方法,但它确实有效。

重要:我现在注意到json中有一些空格,我不得不稍微调整一下正则表达式,我不会改变上面的解释,因为我只添加了一些{ {1}}只要它可以是一个空格。

[]

here你在pastebin上有输出。

进一步讲座this链接可以帮助您使用javascript的正则表达式。

无需卷曲:您可以在here

中测试任何请求输出的内容