2012-04-18 3 views
0

이것은 어제 요청한 question입니다. 필요한 데이터를 얻을 수있었습니다. 최종 데이터는 다음과 같습니다. link을 따르십시오. 나는 다음과 같은 코드를 시도위키 미디어 api가 json 문자열에서 relavant 데이터를 가져 오는 중

내가 처음에 각 요소에 동봉 생각하는 모든 정보 상자 데이터

       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; 
            } 
           } 

를 얻을 {{}}. 그래서 나는이 코드를 썼다. 그러나 내가 본 것은 이것으로 전체 infobox 데이터를 얻을 수 없었습니다. 이 요소가 있습니다

{{Sfn|National Informatics Centre|2005}} 

occuring 내 infobox 데이터를 종료합니다.

json을 사용하지 않으면 훨씬 간단 해 보입니다. 도와주세요

+0

파싱 Wikitext는 HTML을 구문 분석하는 것보다 더 나쁩니다. – Bergi

답변

1

시도해 보셨습니까 DBpedia? Afaik는 템플릿 사용 정보를 제공합니다. Templatetiger이라는 도구 서버 도구도 있는데, 정적 덤프 (라이브가 아닌)에서 템플릿 추출을 수행합니다.

그러나, 나는 한 번 자바 스크립트 wikitext에서 템플릿을 추출하는 작은 조각을 썼다 :

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 
}); 

그것은 한 수준의 중첩 된 템플릿을 제공하지만, 여전히 매우 오류가 발생하기 쉬운. regexp로 wikitext를 파싱하는 것은 html로 시도하는 것보다 나쁘다 :-)

: api.php?action=query&prop=revisions&rvprop=content&rvgeneratexml=1&titles=...을 쿼리하기가 더 쉽습니다. 그 파셋 트리에서 템플릿을 쉽게 추출 할 수 있습니다.

관련 문제