Sadece içerik özetini almak için temiz bir wikipedia API var mı?


150

Sadece bir Wikipedia sayfasının ilk paragrafını almam gerekiyor. İçerik html olarak biçimlendirilmiş, web sitelerimde görüntülenmeye hazır olmalıdır (bu nedenle BBCODE veya WIKIPEDIA özel KODU YOK!)


2
Wikipedia BB kodunu kullanmaz, kendi wiki biçimlendirme kodunu kullanır.
svick

Her wikipedia makalesinde işe yaramaz. ro.wikipedia.org/w/…
dumitru

Yanıtlar:


205

Herhangi bir html ayrıştırma yapmadan tüm "intro bölümünü" almanın bir yolu var! AnthonyS'nin ek bir parametreyle verdiği cevaba benzer şekilde explaintext, giriş bölümü metnini düz metin olarak alabilirsiniz.

Sorgu

Yığın Taşması'nın girişini düz metin olarak alma:

https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=Stack%20Overflow

JSON Yanıtı

(uyarılar kaldırıldı)

{
    "query": {
        "pages": {
            "21721040": {
                "pageid": 21721040,
                "ns": 0,
                "title": "Stack Overflow",
                "extract": "Stack Overflow is a privately held website, the flagship site of the Stack Exchange Network, created in 2008 by Jeff Atwood and Joel Spolsky, as a more open alternative to earlier Q&A sites such as Experts Exchange. The name for the website was chosen by voting in April 2008 by readers of Coding Horror, Atwood's popular programming blog.\nIt features questions and answers on a wide range of topics in computer programming. The website serves as a platform for users to ask and answer questions, and, through membership and active participation, to vote questions and answers up or down and edit questions and answers in a fashion similar to a wiki or Digg. Users of Stack Overflow can earn reputation points and \"badges\"; for example, a person is awarded 10 reputation points for receiving an \"up\" vote on an answer given to a question, and can receive badges for their valued contributions, which represents a kind of gamification of the traditional Q&A site or forum. All user-generated content is licensed under a Creative Commons Attribute-ShareAlike license. Questions are closed in order to allow low quality questions to improve. Jeff Atwood stated in 2010 that duplicate questions are not seen as a problem but rather they constitute an advantage if such additional questions drive extra traffic to the site by multiplying relevant keyword hits in search engines.\nAs of April 2014, Stack Overflow has over 2,700,000 registered users and more than 7,100,000 questions. Based on the type of tags assigned to questions, the top eight most discussed topics on the site are: Java, JavaScript, C#, PHP, Android, jQuery, Python and HTML."
            }
        }
    }
}

Dokümantasyon: API: query / prop = alıntılar


Düzenleme: &redirects=1Yorumlarda önerildiği gibi eklendi .


28
Eş anlamlıların içeriğine otomatik olarak yönlendiren & redirects = 1 kullanılması çok önerilir
14'te kontrol eder

6
Sayfa numarasını bilmiyorsam bu JSON yanıtından nasıl bilgi alabilirim? "Extract" içeren JSON dizisine erişemiyorum
Laurynas G

@LaurynasG Nesneyi bir diziye atabilir ve sonra şöyle tutabilirsiniz: $ extract = current ((dizi) $ json_query-> query-> pages) -> özü
MarcGuay 15:16

@LaurynasG, @MarcGuay Daha kolay yineleme için sayfa kimliğinin bir listesini almak için URL'ye parametre olarak ` indexpageids 'de ekleyebilirsiniz .
Rami

Wiki çağrısından json çıktı var ve sonra dizi $ data = json_decode ($ json, true) json döküm. Sonra kullanarak 'özü' elde etmeye çalışır $extract = current((array)$data->query->pages)->extract;. ancak "Uyarı: Nesne dışı özelliğini almaya çalışmak" devam ediyor.
shikhar bansal

79

Aslında , bu amaç için özel olarak tasarlanmış sorgularla kullanılabilen, özler adı verilen çok güzel bir destek var . Alıntılar makale alıntıları (kesilmiş makale metni) almanızı sağlar. Sıfırıncı bölümdeki metni almak için kullanılabilecek exintro adı verilen bir parametre vardır (resimler veya bilgi kutuları gibi ek varlık yok). Ayrıca, belirli sayıda karakter ( uyarma ) veya belirli sayıda cümle ( exsentences ) gibi daha küçük ayrıntı düzeyine sahip alıntılar da alabilirsiniz.

İşte olan örnek sorgu http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow ve API test ortamı http://en.wikipedia.org/wiki/ Özel: ApiSandbox # action = query & prop = ayıklar & format = json & exintro = & titles = Bu sorgu ile daha fazla deneme yapmak için % 20 Aşırı Akışı yığınla .

İlk paragrafı özellikle istiyorsanız, yine de seçilen cevapta önerildiği gibi ek ayrıştırma yapmanız gerektiğini unutmayın. Buradaki fark, bu sorgu tarafından döndürülen yanıtın, çözümlenecek api yanıtında görüntüler gibi ek varlıklara sahip olmadığınız için önerilen diğer api sorgularından bazılarından daha kısa olmasıdır.


62

2017'den bu yana Wikipedia, daha iyi önbelleğe sahip bir REST API'si sunuyor . Gelen belgeler size mükemmel kullanım örneğini uyan aşağıdaki API bulabilirsiniz. (yeni Sayfa Önizlemeleri özelliği tarafından kullanıldığı için )

https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow küçük bir küçük resmi içeren bir yazlık görüntülemek için kullanılabilecek aşağıdaki verileri döndürür:

{
  "type": "standard",
  "title": "Stack Overflow",
  "displaytitle": "Stack Overflow",
  "extract": "Stack Overflow is a question and answer site for professional and enthusiast programmers. It is a privately held website, the flagship site of the Stack Exchange Network, created in 2008 by Jeff Atwood and Joel Spolsky. It features questions and answers on a wide range of topics in computer programming. It was created to be a more open alternative to earlier question and answer sites such as Experts-Exchange. The name for the website was chosen by voting in April 2008 by readers of Coding Horror, Atwood's popular programming blog.",
  "extract_html": "<p><b>Stack Overflow</b> is a question and answer site for professional and enthusiast programmers. It is a privately held website, the flagship site of the Stack Exchange Network, created in 2008 by Jeff Atwood and Joel Spolsky. It features questions and answers on a wide range of topics in computer programming. It was created to be a more open alternative to earlier question and answer sites such as Experts-Exchange. The name for the website was chosen by voting in April 2008 by readers of <i>Coding Horror</i>, Atwood's popular programming blog.</p>",
  "namespace": {
    "id": 0,
    "text": ""
  },
  "wikibase_item": "Q549037",
  "titles": {
    "canonical": "Stack_Overflow",
    "normalized": "Stack Overflow",
    "display": "Stack Overflow"
  },
  "pageid": 21721040,
  "thumbnail": {
    "source": "https://upload.wikimedia.org/wikipedia/en/thumb/f/fa/Stack_Overflow_homepage%2C_Feb_2017.png/320px-Stack_Overflow_homepage%2C_Feb_2017.png",
    "width": 320,
    "height": 149
  },
  "originalimage": {
    "source": "https://upload.wikimedia.org/wikipedia/en/f/fa/Stack_Overflow_homepage%2C_Feb_2017.png",
    "width": 462,
    "height": 215
  },
  "lang": "en",
  "dir": "ltr",
  "revision": "902900099",
  "tid": "1a9cdbc0-949b-11e9-bf92-7cc0de1b4f72",
  "timestamp": "2019-06-22T03:09:01Z",
  "description": "website hosting questions and answers on a wide range of topics in computer programming",
  "content_urls": {
    "desktop": {
      "page": "https://en.wikipedia.org/wiki/Stack_Overflow",
      "revisions": "https://en.wikipedia.org/wiki/Stack_Overflow?action=history",
      "edit": "https://en.wikipedia.org/wiki/Stack_Overflow?action=edit",
      "talk": "https://en.wikipedia.org/wiki/Talk:Stack_Overflow"
    },
    "mobile": {
      "page": "https://en.m.wikipedia.org/wiki/Stack_Overflow",
      "revisions": "https://en.m.wikipedia.org/wiki/Special:History/Stack_Overflow",
      "edit": "https://en.m.wikipedia.org/wiki/Stack_Overflow?action=edit",
      "talk": "https://en.m.wikipedia.org/wiki/Talk:Stack_Overflow"
    }
  },
  "api_urls": {
    "summary": "https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow",
    "metadata": "https://en.wikipedia.org/api/rest_v1/page/metadata/Stack_Overflow",
    "references": "https://en.wikipedia.org/api/rest_v1/page/references/Stack_Overflow",
    "media": "https://en.wikipedia.org/api/rest_v1/page/media/Stack_Overflow",
    "edit_html": "https://en.wikipedia.org/api/rest_v1/page/html/Stack_Overflow",
    "talk_page_html": "https://en.wikipedia.org/api/rest_v1/page/html/Talk:Stack_Overflow"
  }
}

Varsayılan olarak, yönlendirmeleri izler (böylece /api/rest_v1/page/summary/StackOverflowde çalışır), ancak bu ile devre dışı bırakılabilir?redirect=false

Başka bir etki alanından API erişmek gerekiyorsa ile CORS başlığı ayarlayabilirsiniz &origin=(mesela &origin=*)

2019 Güncellemesi: API, sayfa hakkında daha yararlı bilgiler döndürüyor gibi görünüyor.


1
Bu ayrıca, aradığınız şeyin bir "anlam ayrımı" olup olmadığını bilmeniz gerektiğinde mükemmel olan "türü" de içerir.
Jeel Shah

1
Açısal tabanlı uygulamamdan bu bağlantıya erişmeye çalışırken CORS hatası alıyorum, herkes bunu nasıl çözeceğini söyleyebilir.
Praveen Ojha

2
Bir wikidata kimliği ile sorgulama yapmak mümkün müdür? Ben extratcted bazı json veri var gibi görünüyor "other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""Şimdi QID tarafından özü alabilir miyim?
Sourav Chatterjee

1
Bu, birden fazla sayfanın özetini yüklemek için kullanılabilir mi?
cheesus

@SouravChatterjee ne istedi, bu API sayfa kimlikleriyle arama yapmak için kullanılabilir mi? Değil görünüyor
Abhijit Sarkar

39

Bu kod, sayfanın ilk paragrafının içeriğini düz metin olarak almanızı sağlar.

Bu cevabın bazı kısımları buradan ve dolayısıyla buradan geliyor . Daha fazla bilgi için MediaWiki API belgelerine bakın .

// action=parse: get parsed text
// page=Baseball: from the page Baseball
// format=json: in json format
// prop=text: send the text content of the article
// section=0: top content of the page

$url = 'http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Baseball&prop=text&section=0';
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_USERAGENT, "TestScript"); // required by wikipedia.org server; use YOUR user agent with YOUR contact information. (otherwise your IP might get blocked)
$c = curl_exec($ch);

$json = json_decode($c);

$content = $json->{'parse'}->{'text'}->{'*'}; // get the main text content of the query (it's parsed HTML)

// pattern for first match of a paragraph
$pattern = '#<p>(.*)</p>#Us'; // http://www.phpbuilder.com/board/showthread.php?t=10352690
if(preg_match($pattern, $content, $matches))
{
    // print $matches[0]; // content of the first paragraph (including wrapping <p> tag)
    print strip_tags($matches[1]); // Content of the first paragraph without the HTML tags.
}

Ancak "mercan" kelimesini ararsanız, sonuç gerekli olmayan bir şey olur. Başka bir yolu var mı, böylece sadece smmary ile p etiketleri alınabilir
Deepanshu Goyal

31

Evet var. Örneğin, Yığın Taşması makalesinin ilk bölümünün içeriğini almak istiyorsanız , şöyle bir sorgu kullanın:

http://en.wikipedia.org/w/api.php?format=xml&action=query&prop=revisions&titles=Stack%20Overflow&rvprop=content&rvsection=0&rvparse

Parçalar şu anlama gelir:

  • format=xml: Sonuç biçimlendiricisini XML olarak döndür. Diğer seçenekler (JSON gibi) mevcuttur. Bu, sayfa içeriğinin biçimini etkilemez, yalnızca ekteki veri biçimini etkiler.

  • action=query&prop=revisions: Sayfanın düzeltmeleri hakkında bilgi edinin. Hangi düzeltmeyi belirtmediğimizden sonuncusu kullanılır.

  • titles=Stack%20Overflow: Sayfa hakkında bilgi alın Stack Overflow. İsimlerini ayırırsanız, bir seferde daha fazla sayfanın metnini almak mümkündür |.

  • rvprop=content: Düzeltmenin içeriğini (veya metnini) döndürün.

  • rvsection=0: Yalnızca bölüm 0'dan içerik döndürün.

  • rvparse: HTML olarak ayrıştırılan içeriği döndürür.

Bunun, hatnotlar (“Diğer kullanımlar için…”), bilgi kutuları veya resimler gibi ilk bölümün tamamını döndürdüğünü unutmayın.

API ile çalışmayı kolaylaştıran çeşitli diller için çeşitli kütüphaneler vardır, bunlardan birini kullandıysanız sizin için daha iyi olabilir.


3
Ben içerik HTML ayrıştırılmış istemiyorum, ben sadece "düz metin" (ne wikipedia kodu) almak istiyorum
ışıltı

1
API böyle bir şey sunmuyor. Ve nedenini anlayabiliyorum: API'nin bakış açısından, bu "düz metin" in tam olarak ne içermesi gerektiği açık değil. Örneğin, tabloları "[alıntı gerekli]", gezinme kutuları veya görüntü açıklamalarını içermek için nasıl temsil etmesi gerekir.
svick

2
&redirects=trueBağlantının sonuna eklemek , varsa hedef makaleye ulaşmanızı sağlar.
eric.mitchell

14

Bu, şu anda Wikipedia makalelerinin önde gelen paragraflarını / özetini / bölümünü 0 alması gereken bir web sitesi için kullanıyorum ve sihirbaz sayesinde hepsi tarayıcıda (istemci tarafı javascript) yapılır. JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/

HTML'de baştaki paragrafları (bölüm 0 olarak adlandırılır) şu şekilde almak için Wikipedia API'sını kullanır: http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text§ion=0&callback=?

Daha sonra HTML ve diğer istenmeyen verileri çıkarır, size bir makale özeti temiz bir dize verir, isterseniz, küçük bir değişiklikle, önde gelen paragrafların etrafında bir "p" html etiketi alabilirsiniz, ancak şu anda sadece yeni bir satır var karakter arasında.

Kod:

var url = "http://en.wikipedia.org/wiki/Stack_Overflow";
var title = url.split("/").slice(4).join("/");

//Get Leading paragraphs (section 0)
$.getJSON("http://en.wikipedia.org/w/api.php?format=json&action=parse&page=" + title + "&prop=text&section=0&callback=?", function (data) {
    for (text in data.parse.text) {
        var text = data.parse.text[text].split("<p>");
        var pText = "";

        for (p in text) {
            //Remove html comment
            text[p] = text[p].split("<!--");
            if (text[p].length > 1) {
                text[p][0] = text[p][0].split(/\r\n|\r|\n/);
                text[p][0] = text[p][0][0];
                text[p][0] += "</p> ";
            }
            text[p] = text[p][0];

            //Construct a string from paragraphs
            if (text[p].indexOf("</p>") == text[p].length - 5) {
                var htmlStrip = text[p].replace(/<(?:.|\n)*?>/gm, '') //Remove HTML
                var splitNewline = htmlStrip.split(/\r\n|\r|\n/); //Split on newlines
                for (newline in splitNewline) {
                    if (splitNewline[newline].substring(0, 11) != "Cite error:") {
                        pText += splitNewline[newline];
                        pText += "\n";
                    }
                }
            }
        }
        pText = pText.substring(0, pText.length - 2); //Remove extra newline
        pText = pText.replace(/\[\d+\]/g, ""); //Remove reference tags (e.x. [1], [4], etc)
        document.getElementById('textarea').value = pText
        document.getElementById('div_text').textContent = pText
    }
});

Bunu istemci tarafı komut dosyasına ekliyor musunuz? Öyleyse, bu XSS değil mi?
craig

Çok fazla hata var, betiğinizle bu bağlantıyı deneyin: en.wikipedia.org/wiki/Modular_Advanced_Armed_Robotic_System
rohankvashisht

8

Bu url özetini xml biçiminde döndürür.

http://lookup.dbpedia.org/api/search.asmx/KeywordSearch?QueryString=Agra&MaxHits=1

Vikipedi'den bir anahtar kelimenin açıklamasını almak için bir işlev oluşturdum.

function getDescription($keyword){
    $url='http://lookup.dbpedia.org/api/search.asmx/KeywordSearch?QueryString='.urlencode($keyword).'&MaxHits=1';
    $xml=simplexml_load_file($url);
    return $xml->Result->Description;
}
echo getDescription('agra');

5

Ayrıca , Vikipedi içeriğini alan ve ondan yapılandırılmış bilgi ( DBF) oluşturan ve bunu bir API aracılığıyla kullanılabilir hale getiren DBPedia aracılığıyla ilk sayfalama gibi içerikleri de alabilirsiniz . DBPedia API bir SPARQL (RDF tabanlı) ama JSON çıktı ve sarmak oldukça kolaydır.

Örnek olarak, bir özet ilk paragraf da dahil olmak üzere yapılandırılmış içeriği ayıklayabilen WikipediaJS adında süper basit bir JS kütüphanesi: http://okfnlabs.org/wikipediajs/

Bu blog yayınında daha fazla bilgi bulabilirsiniz: http://okfnlabs.org/blog/2012/09/10/wikipediajs-a-javascript-library-for-accessing-wikipedia-article-information.html

JS kütüphane kodunu şu adreste bulabilirsiniz: https://github.com/okfn/wikipediajs/blob/master/wikipedia.js



1

Sadece bölebileceğiniz ancak API'yı kullanmak istemediğiniz metni arıyorsanız en.wikipedia.org/w/index.php?title=Elephant&action=raw adresine bakın.


"Web sitelerimde görüntülenmeye hazır (BBCODE ya da WIKIPEDIA özel kodu YOK!)" Ve bu tam bir
muhalefet

1

Benim yaklaşımım (PHP'de) şu şekildeydi:

$url = "whatever_you_need"

$html = file_get_contents('https://en.wikipedia.org/w/api.php?action=opensearch&search='.$url);
$utf8html = html_entity_decode(preg_replace("/U\+([0-9A-F]{4})/", "&#x\\1;", $html), ENT_NOQUOTES, 'UTF-8');

$utf8html daha fazla temizlenmesi gerekebilir, ancak temelde budur.


&
Utf8

1

@Michael Rapadas ve @ Krinkle'nin çözümünü denedim ama benim durumumda büyük / küçük harf kullanımına bağlı olarak bazı makaleler bulmakta zorlandım. Burası gibi:

https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro=&exsentences=1&explaintext=&titles=Led%20zeppelin

Not ile yanıtı kestim exsentences=1

Görünüşe göre "başlık normalizasyonu" düzgün çalışmıyor:

Başlık normalizasyonu sayfa başlıklarını standart formlarına dönüştürür. Bu, ilk karakteri büyük harfe çevirme, alt çizgileri boşluklarla değiştirme ve ad alanını o wiki için tanımlanan yerelleştirilmiş forma değiştirme anlamına gelir. Hangi sorgu modüllerinin kullanıldığına bakılmaksızın başlık normalleştirmesi otomatik olarak yapılır. Ancak, sayfa başlıklarındaki (\ n) sondaki satır sonları garip davranışlara neden olur ve önce bunların çıkarılması gerekir.

Büyük / küçük harf sorununu kolayca çözmüş olabileceğimi biliyorum, ancak nesneyi bir diziye dökmenin zorluğu da vardı.

Gerçekten iyi bilinen ve tanımlanmış bir aramanın ilk paragrafını istediğim için (başka bir makaleden bilgi alma riski yok) Bunu şöyle yaptım:

https://en.wikipedia.org/w/api.php?action=opensearch&search=led%20zeppelin&limit=1&format=json

Bu durumda, limit=1

Bu yoldan:

  1. Yanıt verilerine çok kolay erişebiliyorum.
  2. Yanıt oldukça küçük.

Ancak araştırmamızın büyük harf kullanımına dikkat etmeliyiz.

Daha fazla bilgi: https://www.mediawiki.org/wiki/API:Opensearch

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.