2013-05-28 31 views
1

在joksnet的程序here的幫助下,我設法獲取了我正在尋找的純文本維基百科文章。使用python製作(希望簡單)的wiki解析器

文本返回包括標題Wiki標記,因此,例如,在Albert Einstein article的部分被這樣的返回:

==Biography== 

===Early life and education=== 
blah blah blah 

我真的很想做的是飼料檢索到的文本到斜體功能和包裝所有的頂級部分大膽HTML標籤和第二級段,像這樣:

<b>Biography</b> 

<i>Early life and education</i> 
blah blah blah 

但我怕我不知道如何甚至開始,至少在沒有做該功能危險幼稚。我需要使用正則表達式嗎? 任何建議非常感謝。

PS對不起,如果「解析」是一個字太強,我想在這裏做什麼。

+0

爲什麼讓另一個解析器?你不能只是[從API獲取HTML](https://www.mediawiki.org/wiki/API:Parsing_wikitext),並用JavaScript/CSS改變/設置h2和h3標籤? – Nemo

回答

1

我落得這樣做:

def parseWikiTitles(x): 
    counter = 1 

    while '===' in x: 
     if counter == 1: 
      x = x.replace('===','<i>',1) 
      counter = 2 

     else: 
      x = x.replace('===',r'</i>',1) 
      counter = 1 

    counter = 1 

    while '==' in x: 
     if counter == 1: 
      x = x.replace('==','<b>',1) 
      counter = 2 

     else: 
      x = x.replace('==',r'</b>',1) 
      counter = 1 


    x = x.replace('<b> ', '<b>', 50) 
    x = x.replace(r' </b>', r'</b>', 50) 
    x = x.replace('<i> ', '<i>', 50) 
    x = x.replace(r' </i>', r'<i>', 50) 

    return x 

我通過與維基標題到該函數的文本字符串,並將其返回與==和===相同的文本用粗體和斜體HTML標籤更換。最後一件事是刪除標題之前和之後的空格,例如== title ==轉換爲<b>title</b>而不是<b> title </b>

迄今爲止沒有問題。

感謝您的幫助球員, 亞歷

1

您可以使用正則表達式和Scrapy模塊,如Scrapy和Beautifulsoup來解析和刮擦維基頁面。 現在你澄清了你的問題,我建議你使用github上託管的py-wikimarkup模塊。鏈接是https://github.com/dcramer/py-wikimarkup/。我希望有所幫助。

+0

謝謝,但我不認爲這正是我期待的。我已經以幾乎完全符合我想要的格式獲得了這些頁面。我只是想用'標題1'和'標題2'替換'== Heading 1 =='和'=== Heading 2 ===''。我不認爲Beautifulsoup或Scrapy可以幫助我。 –

2

我認爲這裏最好的方法是讓MediaWiki負責解析。我不知道你正在使用的庫,但基本上這是返回解析HTML的區別

返回原始wiki文字之間

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Albert%20Einstein&rvprop=content

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Albert%20Einstein&rvprop=content&rvparse

+0

謝謝,我可能會這樣做,但我已經嘗試恢復HTML,它給了我unicode編碼錯誤,我不知道如何解決。加上將HTML轉換爲明文也不是那麼簡單。也許我會嘗試創建一個解析器,它只是遍歷文本,並用代替每一個第一個===,然後每秒用代替,然後再次遍歷它,並用代替每個==,每秒用代替。問題是如果計數一旦下降就會中斷,但我想它應該在大多數情況下工作...... –