0

これは私が昨日尋ねた質問です。必要なデータを取得できました。最終的なデータはこんな感じです。このリンクをたどってください。

次のコードを使用して、すべてのインフォボックスデータを取得しようとしました

                                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を使用しない方がはるかに簡単なようです。私を助けてください

4

1 に答える 1

1

DBpediaを試しましたか?Afaikは、テンプレートの使用情報を提供します。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
});

1レベルのネストされたテンプレートを備えていますが、それでもエラーが発生しやすくなっています。正規表現を使用してウィキテキストを解析することは、HTMLで実行しようとするのと同じくらい邪悪です:-)

apiから解析ツリーをクエリする方が簡単な場合があります:api.php?action = query&prop = Revisions&rvprop = content& rvgeneratexml = 1&titles=...。その解析ツリーから、テンプレートを簡単に抽出できるようになります。

于 2012-04-18T16:56:21.473 に答える