2012-05-21 2 views
1

Я использую Википедии JSON API, и я принести, чтобы получить содержимое страницы без ссылок , например,Wikipedia JSON API получить содержимое страницы без ссылки

https://en.wikipedia.org/w/api.php?action=query&format=json&titles=May_21&prop=revisions&rvprop=content&rvsection=1 

Например:

[[293]] – Roman Emperors [[Diocletian]] and [[Maximian]] appoint [[Galerius]] as [[Caesar (title)|''Caesar'']] to Diocletian, beginning the period of four rulers known as the [[Tetrarchy]]. 

Заменить &ndash с -

[[Caesar (title)|''Caesar'']] Должно быть Caesar

Я использую Objective-C

Как я могу получить такое же содержимое страницы, но без ссылок символов?

Спасибо!

+1

Вы должны уточнить, что вы имеете в виду ссылки персонажей. Возможно, покажите пример в своем вопросе о том, как это будет выглядеть. – jmort253

+0

, вы должны заменить их, используя регулярные выражения. На каком языке вы используете? –

+0

Спасибо, я использую Objective-C, пожалуйста, взгляните на мой второй пример, я не могу манипулировать этим текстом, потому что он может варьироваться. – jkigel

ответ

1

, что это должно быть :-)

NSString * stringToParse = @"{\"query\":{\"normalized\":[{\"from\":\"May_21\",\"to\":\"May 21\"}],\"pages\":{\"19684\":{\"pageid\":19684,\"ns\":0,\"title\":\"May 21\",\"revisions\":[{\"*\":\"==Events==\\n* [[293]] – Roman Emperors [[Diocletian]] and [[Maximian]] appoint [[Galerius]] as [[Caesar (title)|''Caesar'']] to Diocletian, beginning the period of four rulers known as the [[Tetrarchy]].\\n* [[878]] – [[Syracuse, Italy]], is [[Muslim conquest of Sicily|captured]] by the ..."; 

//Replace &ndash with - 
stringToParse = [stringToParse stringByReplacingOccurrencesOfString:@"&ndash" withString:@"-"]; 

//[[Caesar (title)|''Caesar'']] Should be Caesar 
//and [[Maximian]] should be Maximian 
//same for [[1972]] -> 1972 
NSString *regexToReplaceWikiLinks = @"\\[\\[([A-Za-z0-9_()]+?\\|)?(\\'\\')?(.+?)(\\'\\')?\\]\\]"; 

NSError *error = NULL; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexToReplaceWikiLinks 
                     options:NSRegularExpressionCaseInsensitive 
                     error:&error]; 

// attention, the found expression is replacex with the third parenthesis 
NSString *modifiedString = [regex stringByReplacingMatchesInString:stringToParse 
                  options:0 
                  range:NSMakeRange(0, [stringToParse length]) 
                 withTemplate:@"$3"]; 

NSLog(@"%@", modifiedString); 

приводит:

{"query":{"normalized":[{"from":"May_21","to":"May 21"}],"pages":{"19684":{"pageid":19684,"ns":0,"title":"May 21","revisions":[{"*":"==Events==\n* 293 -; Roman Emperors Diocletian and Maximian appoint Galerius as Caesar to Diocletian, beginning the period of four rulers known as the Tetrarchy.\n* 878 -; Syracuse, Italy, is captured by the ... 
2

Используйте текстовый конвертер HTML (например, links или какой-либо симулятор браузера, такой как PhantomJS). Путь менее болезнен, чем преобразование wikitext в текст, и в этом случае вам придется иметь дело с шаблонами.

+0

... не только шаблоны, но вся разметка wiki ужасна для «разбора». – Bergi

+0

возможно, но это не решает проблему, иногда вам нужно использовать то, что у вас есть ... – Flori

0

Regular expressions - это способ решить эту проблему; Вот пример использования JavaScript (но вы можете применить одно и то же решение к любому языку с регулярными выражениями);

<dl> 
    <script type="text/javascript"> 

     var source = "[[293]] &ndash; Roman Emperors [[Diocletian]] and [[Maximian]] appoint [[Galerius]] as [[Caesar (title)|''Caesar'']] to Diocletian, beginning the period of four rulers known as the [[Tetrarchy]]."; 

     document.writeln('<dt> Original </dt>'); 
     document.writeln('<dd>' + source + '</dd>'); 

     // Replace links with any found titles 
     var matchTitles = /\[\[([^\]]+?)\|\'\'(.+?)\'\']\]/ig; /* <- Answer */ 
     source = source.replace(matchTitles, '$2'); 

     document.writeln('<dt> First Pass </dt>'); 
     document.writeln('<dd style="color: green;">' + source + '</dd>'); 

     // Replace links with contents 
     var matchLinks = /\[\[(.+?)\]\]/ig; 
     source = source.replace(matchLinks, '$1'); 

     document.writeln('<dt> Second Pass </dt>'); 
     document.writeln('<dd>' + source + '</dd>'); 
    </script> 
</dl> 

Вы также можете увидеть это работает здесь: http://jsfiddle.net/NujmB/

0

Я не знаю, Objective C, но вот код в JavaScript, который я использую для тех же целей
(Она может работать как psedo код вам и помочь другим пользователям из JavaScript)

var url = 'http://en.wikipedia.org/w/api.php?callback=?&action=parse&page=facebook&prop=text&format=json&section=0'; 
    // Section = 0 for taking first section of wiki page i.e. introduction only  
      $.getJSON(url,function(response){ 
       // Taking only the first paragraph from introduction 
       var intro = $(response.parse.text['*']).filter('p:eq(0)').html(); 
       var wikiBox = $('#wikipediaBox .wikipedia div.overview'); 
       wikiBox.empty().html(intro); 
       // Converting relative links into absolute ones and links into outer links 
       wikiBox.find("a:not(.references a)").attr("href", function(){ return "http://www.wikipedia.org" + $(this).attr("href");}); 
       wikiBox.find("a").attr("target", "_blank"); 
       // Removing edits markers 
       wikiBox.find('sup.reference').remove(); 
      }); 
Смежные вопросы