2009-06-13 152 views
9

我仍然堅持試圖從維基百科解析文章的問題。實際上,我希望解析來自維基百科的文章的信息框部分,即我的應用程序提及國家和每個國家/地區頁面,我希望能夠顯示該國家相應wikipedia文章中的信息框。我在這裏使用的PHP - 如果有人有任何代碼片段或建議我應該在這裏做什麼,我將不勝感激。如何抓取維基百科文章的解析信息框?

再次感謝。


編輯

嗯,我有國家名稱的數據庫表。我有一個腳本,需要一個國家,並顯示其細節。我想抓取信息框 - 包含所有國家/地區詳細信息圖片的藍色框,因爲它來自維基百科,並顯示在我的頁面上。我想知道一個非常簡單和容易的方法 - 或者有一個腳本,它只是將信息框的信息下載到本地遠程系統,稍後我可以訪問自己的遠程系統。我的意思是我打開的思想在這裏 - 除了最後的結果我希望看到我的網頁上的信息框 - 當然,在底部:)


編輯內容很少維基百科的鏈接

我想我在http://infochimps.org上找到了我正在尋找的東西 - 他們得到了大量的數據集,我認爲是YAML語言。我可以直接使用這些信息,但我需要一種不斷更新維基百科信息的方法,儘管我相信信息框很少會改變,特別是o國家,除非有些國家決定改變它的首府城市。

回答

-5

我建議對維基百科進行WebRequest。從那裏你將擁有該頁面,你可以簡單地使用正則表達式,字符爬行或其他你熟悉的表單來解析或查詢你需要的數據。本質上是一個屏幕刮!

編輯 - 我會添加到這個答案,你可以使用HtmlAgilityPack爲那些在C#土地。對於PHP,它看起來像SimpleHtmlDom。話雖如此,它看起來像維基百科有一個比足夠的API。這個問題可能回答您的需求最好的:

Is there a Wikipedia API?

+1

這是浪費資源。 – 2009-06-13 06:14:40

+0

對不起 - 我可以看到你的意思是巨大的資源浪費。每次當您網站上的某個人需要查看該網頁時,我並不是故意要刮掉網頁。我認爲你可以在離線狀態下(如果你選擇這樣做)將其存儲在應用程序的本地數據庫中(對所有相關方而言效率更高)。不是故意吸引火焰! :P – 2009-06-13 06:41:46

+0

@Andrew - 我接受所有可能性 - 但我不確定如何開始。有什麼樣的工作代碼我可以看看開始呢? – Ali 2009-06-13 10:23:15

10

我建議你使用DBPedia代替它已經完成轉向維基百科中的數據轉化爲可用,可鏈接,打開的窗體的工作。

2

這取決於你想要走什麼路線。這裏有一些可能性:

  1. 安裝MediaWiki和適當的 修改。它畢竟是一個 PHP應用程序設計精確解析 wikitext ...
  2. 下載static HTML version,並解析出你想要的部分。
  3. 使用Wikipedia API進行適當的緩存。

不要正好砸在最新版本的直播頁面,然後重新進行解析每一個你的應用程序想要箱的時間。這對於您和維基媒體來說都是巨大的資源浪費。如果要分析一個時間的所有文章

2

有一些語義數據提供者,從中可以提取,而不是試圖手動分析它的結構化數據:

  • DBpedia中 - 前面已經提到提供SPARQL端點這可能是使用了數據的查詢。有許多庫可用於多種平臺,包括PHP。

  • Freebase - 另一個創意公用數據提供商。初始數據集基於解析的維基百科數據,但有一些信息來自其他來源。任何人都可以編輯數據集,與維基百科相比,您可以使用自定義模式將自己的數據添加到自己的名稱空間中。使用自己的稱爲MQL的查詢語言,它基於JSON。數據有WebID鏈接回相關維基百科文章。免費的基地還提供了一些可下載的數據轉儲。 Freebase有許多客戶端庫,包括PHP。

  • Geonames - 地理位置數據庫。具有提供給定座標,附近位置(例如城市,火車站等)的國家和地區信息的API

  • Opensteetmap - 社區建立的世界地圖。有API允許按位置和類型查詢對象。

  • 維基衛星地圖API - 另一個位置服務

14

我會用維基百科(維基)API。您可以以JSON,XML,PHP本機格式和其他方式獲取數據。然後,您仍然需要解析返回的信息以提取和格式化所需的信息,但信息框的開始,停止和信息類型已清除。

針對rvsection = 0運行您的查詢,因爲此第一部分在第一個分節符之前爲您提供材料,包括信息框。然後你需要解析信息框內容,這不應該太難。請參閱en.wikipedia.org/w/api.php獲取正式的wikipedia API文檔,以及www.mediawiki.org/wiki/API獲取該手冊。

運行,例如,查詢:http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=xmlfm&titles=fortran&rvsection=0

2

要加載解析後的第一部分中,只要這個參數添加到API URL的結尾

rvparse 

像這樣: http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=xmlfm&titles=fortran&rvsection=0&rvparse

然後解析html以獲取信息框表格(使用正則表達式)

$url = "http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&titles=Niger&rvsection=0&rvparse"; 
    $data = json_decode(file_get_contents($url), true); 
    $data = current($data['query']['pages']); 
    $regex = '#<\s*?table\b[^>]*>(.*)</table\b[^>]*>#s'; 
    $code = preg_match($regex, $data["revisions"][0]['*'], $matches); 
    echo($matches[0]);