2012-04-18 7 views
0

Это question Я спросил вчера. Я смог получить требуемые данные. Окончательные данные таковы. Следуйте за этим link.wikimedia api получение relavant данных из строки json

Я попытался с помощью следующего кода, чтобы получить все данные Infobox

       content = content.split("}}\n"); 
           for(k in content) 
           { 
            if(content[k].search("Infobox")==2) 
            { 
             var infobox = content[k]; 
             alert(infobox); 
             infobox = infobox.replace("{{",""); 
             alert(infobox); 
             infobox = infobox.split("\n|"); 
             //alert(infobox[0]); 
             var infohtml=""; 
             for(l in infobox) 
             { 
              if(infobox[l].search("=")>0) 
              { 
               var line = infobox[l].split("="); 

               infohtml = infohtml+"<tr><td>"+line[0]+"</td><td>"+line[1]+"</td></tr>"; 

              } 
             } 
             infohtml="<table>"+infohtml+"</table>"; 
             $('#con').html(infohtml); 
             break; 
            } 
           } 

Я изначально думал каждый элемент заключен в {{}}. Поэтому я написал этот код. Но я вижу, что я не смог получить данные инфобокса с этим. Существует этот элемент

{{Sfn|National Informatics Centre|2005}} 

происхождение, заканчивающееся моими данными инфобокса.

Кажется, это намного проще без использования json. Помогите мне

+0

Парсинг Викитекс более злой, чем синтаксический разбор HTML :-) – Bergi

ответ

1

Вы попробовали DBpedia? Afaik предоставляют информацию об использовании шаблонов. Существует также инструмент toolserver с именем Templatetiger, который извлекает шаблон из статических дампов (не вживую).

Однако, однажды я написал крошечную фрагмент кода для извлечения шаблонов из вики-текста в JavaScript:

var title; // of the template 
var wikitext; // of the page 
var templateRegexp = new RegExp("{{\\s*"+(title.indexOf(":")>-1?"(?:Vorlage:|Template:)?"+title:title)+"([^[\\]{}]*(?:{{[^{}]*}}|\\[?\\[[^[\\]]*\\]?\\])?[^[\\]{}]*)+}}", "g"); 
var paramRegexp = /\s*\|[^{}|]*?((?:{{[^{}]*}}|\[?\[[^[\]]*\]?\])?[^[\]{}|]*)*/g; 
wikitext.replace(templateRegexp, function(template){ 
    // logabout(template, "input "); 
    var parameters = template.match(paramRegexp); 
    if (!parameters) { 
     console.log(page.title + " ohne Parameter:\n" + template); 
     parameters = []; 
     } 
    var unnamed = 1; 
    var p = parameters.reduce(function(map, line) { 
     line = line.replace(/^\s*\|/,""); 
     var i = line.indexOf("="); 
     map[line.substr(0,i).trim() || unnamed++] = line.substr(i+1).trim(); 
     return map; 
    }, {}); 
    // you have an object "p" in here containing the template parameters 
}); 

Он имеет вложенные шаблоны одноуровневые, но все еще очень подвержен ошибкам. Parsing wikitext с регулярным выражением так же злобно, как попытка сделать это на html :-)

Возможно, будет проще запросить parse-tree from the api: api.php?action=query&prop=revisions&rvprop=content&rvgeneratexml=1&titles=.... Из этого parsetree вы сможете легко извлечь шаблоны.