2015-04-23 79 views
0

如何使維基百科API調用獲得該頁面上的前5個機場名稱,位置,國家?維基百科api在頁面上調用特定內容

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

+0

維基百科的API文檔和示例的任何請求輸出可以在這裏找到:http://m.mediawiki.org/wiki/API:Main_page。有什麼特別的你正在努力?你能告訴我們一些代碼嗎?你在這裏使用什麼技術? – xboxremote

+0

我正在學習Angular,並嘗試查看是否可以使用Wikipedia內容創建我的第一個Angular項目。由於包含所有其他數據,因此我從維基百科的頁面提取某些數據時遇到了問題。 – Ohsik

回答

1

在這裏你可以看到你所需要prettyfied所有的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,你會得到公正的有用數據。

解決方案:

通過在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端點,然後用捲髮做一個GET請求到維基百科的API,它獲取您請求的頁面上的所有可用數據,然後我使用正規表達式來解析所需的值。我使用的正則表達式是:

sed 's|\\u||g' 

這個人是被sed(流編輯器)進行,它的作用是 搜索的\u每一次出場(代表的Unicode字符 )並將其刪除。我需要這樣做,因爲稍後我將使用字符串'\n'(代表新行)作爲行的分隔符。 的方式它做什麼,我說,這確實是使用命令的sed s用於替換字符串\u的每一次亮相,被 兩回斜線的原因是因爲它需要進行轉義或將它解釋爲命令的一部分。

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

這個正則表達式是由grep進行,第一我們做(如 前面提到過)是匹配任何新線這將是\n,我們再次 需要躲避後面削減。然後我們需要匹配字符|和 它也需要被轉義。然後我們需要匹配[0-9]+裏面的所有數字[]裏面的所有內容都是一個字符,0-9是我們要匹配的範圍,+代表一個或多個,我們也希望字符.也需要轉義,然後兩個再次將這個字符重新編號:|。在這一點上,我們已經匹配了索引,現在我們希望匹配每一個字符直到行結束,這將是'\ n',但由於我們已經刪除了無用的\u,所有的反斜槓都是爲了新的線,所以,這裏是我們需要的匹配:[\\],但我們想否定它,這就是爲什麼我們在反斜線前添加^,然後*匹配零個或多個未反斜槓的未知字符。正則表達式前面的-onE是傳遞給grep的選項,其含義是o = only match,n = number each lineE = extended regular expression

grep -onE '} \[\[[^\]*]]' 

在這一點上,我們都在他們每個人的所有可用的數據行,我們想獲取剛剛被內[[...]],總是一個}後包圍的名字,這是和以前一樣,但是我們不希望這一次的角色是],而不是\

sed 's/[\[|:}]//g; s/]]//; s/[0-9][0-9]*//g; s/ //' 

這個sed命令所做的唯一的事情就是通過在[]內對它們進行分組並刪除它們來刪除所有非字母字符。也許這不是更有效的方法,但它有效。

重要:我現在就注意到,有在JSON中的一些空間,我不得不調整正則表達式多一點,我不會改變上面的解釋,因爲我只加了一些?每當它可能是一個空白。

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 -E '\\n\|[0-9]+\.\|\|[^\\]*' | grep -onE '} ?\[\[[^[\]*]' | sed 's/[\[|:}]//g; s/]]//; s/[0-9][0-9]*//g; s/ //' 

and here你在pastebin上有輸出。

進一步講座this鏈接將幫助您在javascript中使用正則表達式。

無需捲曲的:你可以測試什麼here