Muszę tylko pobrać pierwszy akapit strony Wikipedii. Treść musi być sformatowana w formacie html, gotowa do wyświetlania na moich stronach internetowych (więc BEZ BBCODE lub specjalnego KODU WIKIPEDIA!)
Muszę tylko pobrać pierwszy akapit strony Wikipedii. Treść musi być sformatowana w formacie html, gotowa do wyświetlania na moich stronach internetowych (więc BEZ BBCODE lub specjalnego KODU WIKIPEDIA!)
Odpowiedzi:
Jest sposób, aby uzyskać całą „sekcję intro” bez przetwarzania kodu HTML! Podobnie jak w przypadku odpowiedzi AnthonyS z dodatkowym explaintext
parametrem, tekst sekcji wstępu można uzyskać w postaci zwykłego tekstu.
Pobieranie wprowadzenia Stack Overflow w postaci zwykłego tekstu:
(ostrzeżenia usunięte)
{
"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."
}
}
}
}
Dokumentacja: API: query / prop = extracts
Edycja: dodano &redirects=1
zgodnie z zaleceniami w komentarzach.
$extract = current((array)$data->query->pages)->extract;
. ale „Uwaga: próba uzyskania właściwości niebędącej przedmiotem” wciąż się pojawia.
W rzeczywistości istnieje bardzo fajna właściwość zwana ekstraktami, której można używać z zapytaniami zaprojektowanymi specjalnie do tego celu. Wyciągi pozwalają uzyskać fragmenty artykułu (obcięty tekst artykułu). Istnieje parametr o nazwie exintro, którego można użyć do pobrania tekstu w sekcji zerowej (bez dodatkowych zasobów, takich jak obrazy lub infoboksy). Możesz także pobierać fragmenty o większej szczegółowości, takie jak pewna liczba znaków ( wymiany ) lub określona liczba zdań ( exsentences )
Oto przykładowe zapytanie http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow i piaskownica API http://en.wikipedia.org/wiki/ Special: ApiSandbox # action = query & prop = extracts & format = json & exintro = & titles = Stack% 20Overflow, aby eksperymentować z tym zapytaniem.
Zwróć uwagę, że jeśli chcesz konkretnie zapoznać się z pierwszym akapitem, nadal musisz wykonać dodatkowe przetwarzanie, zgodnie z sugestią w wybranej odpowiedzi. Różnica polega na tym, że odpowiedź zwrócona przez to zapytanie jest krótsza niż niektóre inne sugerowane zapytania interfejsu API, ponieważ nie masz dodatkowych zasobów, takich jak obrazy w odpowiedzi interfejsu API do analizy.
Od 2017 roku Wikipedia udostępnia REST API z lepszym buforowaniem. W dokumentacji możesz znaleźć następujące API, które idealnie pasuje do twojego przypadku użycia. (tak jak jest używana w nowej funkcji Podgląd strony )
https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow
zwraca następujące dane, których można użyć do wyświetlenia podsumowania z małą miniaturą:
{
"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"
}
}
Domyślnie podąża za przekierowaniami (więc to /api/rest_v1/page/summary/StackOverflow
również działa), ale można to wyłączyć za pomocą?redirect=false
Jeśli potrzebujesz dostępu do API z innej domeny, możesz ustawić nagłówek CORS za pomocą &origin=
(np. &origin=*
)
Aktualizacja 2019: wydaje się, że API zwraca bardziej przydatne informacje o stronie.
"other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""
Czy możemy teraz uzyskać wyciąg za pomocą identyfikatora QID?
Ten kod umożliwia pobranie zawartości pierwszego akapitu strony w postaci zwykłego tekstu.
Część tej odpowiedzi pochodzi stąd, a więc stąd . Zobacz dokumentację MediaWiki API , aby uzyskać więcej informacji.
// 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§ion=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.
}
Tak jest. Na przykład, jeśli chcesz uzyskać zawartość pierwszej sekcji artykułu Stack Overflow , użyj zapytania takiego:
Części oznaczają to:
format=xml
: Zwróć program formatujący wynik jako XML. Dostępne są inne opcje (takie jak JSON). Nie ma to wpływu na format samej zawartości strony, tylko na otaczający format danych.
action=query&prop=revisions
: Uzyskaj informacje o wersjach strony. Ponieważ nie określamy, która rewizja, używana jest najnowsza.
titles=Stack%20Overflow
: Uzyskaj informacje o stronie Stack Overflow
. Możliwe jest pobranie tekstu większej liczby stron za jednym razem, jeśli oddzielisz ich nazwy za pomocą |
.
rvprop=content
: Zwróć treść (lub tekst) wersji.
rvsection=0
: Zwróć tylko zawartość z sekcji 0.
rvparse
: Zwróć treść przeanalizowaną jako HTML.
Należy pamiętać, że zwraca to całą pierwszą sekcję, w tym takie rzeczy, jak hatnotes („Do innych zastosowań…”), infoboksy lub obrazy.
Dostępnych jest kilka bibliotek dla różnych języków, które ułatwiają pracę z API, może być lepiej, jeśli użyjesz jednej z nich.
&redirects=true
na końcu linku gwarantuje, że dotrzesz do artykułu docelowego, jeśli taki istnieje.
To jest kod, którego teraz używam dla strony internetowej, którą tworzę, która musi pobierać wiodące akapity / podsumowanie / sekcję 0 artykułów spoza Wikipedii, a wszystko to odbywa się w przeglądarce (javascript po stronie klienta) dzięki magii JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/
Używa interfejsu API Wikipedii, aby uzyskać wiodące akapity (zwane sekcją 0) w HTML, jak na przykład: http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text§ion=0&callback=?
Następnie usuwa kod HTML i inne niepożądane dane, dając czysty ciąg podsumowania artykułu, jeśli chcesz, możesz po drobnych poprawkach uzyskać znacznik html "p" wokół początkowych akapitów, ale teraz jest tylko nowa linia charakter między nimi.
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§ion=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
}
});
Ten adres URL zwróci podsumowanie w formacie xml.
http://lookup.dbpedia.org/api/search.asmx/KeywordSearch?QueryString=Agra&MaxHits=1
Stworzyłem funkcję do pobierania opisu słowa kluczowego z Wikipedii.
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');
Możesz również pobrać zawartość, taką jak pierwszy pagagram, za pośrednictwem DBPedia, która pobiera zawartość Wikipedii i tworzy z niej ustrukturyzowane informacje (RDF) i udostępnia je za pośrednictwem interfejsu API. DBPedia API jest interfejsem SPARQL (opartym na RDF), ale wysyła JSON i jest dość łatwy do zapakowania.
Jako przykład podajemy bardzo prostą bibliotekę JS o nazwie WikipediaJS, która może wyodrębniać ustrukturyzowaną zawartość, w tym podsumowanie pierwszego akapitu: http://okfnlabs.org/wikipediajs/
Możesz przeczytać więcej na ten temat w tym poście na blogu: http://okfnlabs.org/blog/2012/09/10/wikipediajs-a-javascript-library-for-accessing-wikipedia-article-information.html
Kod biblioteki JS można znaleźć tutaj: https://github.com/okfn/wikipediajs/blob/master/wikipedia.js
Do abstract.xml.gz
wywrotki brzmi jak ten, który chcesz.
Jeśli szukasz tylko tekstu, który możesz następnie podzielić, ale nie chcesz korzystać z API, zajrzyj na en.wikipedia.org/w/index.php?title=Elephant&action=raw
Moje podejście było następujące (w PHP):
$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
może wymagać dalszego czyszczenia, ale to w zasadzie wszystko.
Wypróbowałem rozwiązanie @Michael Rapadas i @ Krinkle, ale w moim przypadku miałem problem ze znalezieniem niektórych artykułów w zależności od wielkości liter. Jak tutaj:
Uwaga Skróciłem odpowiedź z exsentences=1
Najwyraźniej „normalizacja tytułu” nie działała poprawnie:
Normalizacja tytułów konwertuje tytuły stron do ich postaci kanonicznej. Oznacza to zamianę pierwszego znaku na wielką literę, zastąpienie podkreślenia spacjami i zmianę przestrzeni nazw na zlokalizowaną formę zdefiniowaną dla tej wiki. Normalizacja tytułu jest wykonywana automatycznie, niezależnie od używanych modułów zapytań. Jednak wszelkie końcowe podziały wierszy w tytułach stron (\ n) spowodują dziwne zachowanie i należy je najpierw usunąć.
Wiem, że mogłem łatwo rozwiązać problem z wielkimi literami, ale była też niedogodność związana z koniecznością rzutowania obiektu na tablicę.
Tak więc, ponieważ bardzo chciałem uzyskać pierwszy akapit dobrze znanego i zdefiniowanego wyszukiwania (bez ryzyka pobierania informacji z innych artykułów), zrobiłem to tak:
https://en.wikipedia.org/w/api.php?action=opensearch&search=led%20zeppelin&limit=1&format=json
Uwaga w tym przypadku zrobiłem obcięcie z limit=1
Tą drogą:
Musimy jednak uważać na wielkie litery w naszych wynikach wyszukiwania.
Więcej informacji: https://www.mediawiki.org/wiki/API:Opensearch