ฉันต้องการเพียงแค่ดึงย่อหน้าแรกของหน้า Wikipedia เนื้อหาจะต้องมีรูปแบบ HTML พร้อมที่จะปรากฏบนเว็บไซต์ของฉัน (ดังนั้นไม่มี BBCODE หรือรหัสพิเศษ WIKIPEDIA!)
ฉันต้องการเพียงแค่ดึงย่อหน้าแรกของหน้า Wikipedia เนื้อหาจะต้องมีรูปแบบ HTML พร้อมที่จะปรากฏบนเว็บไซต์ของฉัน (ดังนั้นไม่มี BBCODE หรือรหัสพิเศษ WIKIPEDIA!)
คำตอบ:
มีวิธีรับ "ส่วนแนะนำ" ทั้งหมดโดยไม่มีการแยกวิเคราะห์ HTML! เช่นเดียวกับคำตอบของ AnthonyS พร้อมexplaintext
พารามิเตอร์เพิ่มเติมคุณสามารถรับข้อความส่วนบทนำด้วยข้อความธรรมดา
รับอินโทร Stack Overflow ในข้อความล้วน:
(คำเตือนถูกปล้น)
{
"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."
}
}
}
}
เอกสารประกอบ: API: query / prop = แยก
แก้ไข: เพิ่ม&redirects=1
ตามที่แนะนำในความคิดเห็น
$extract = current((array)$data->query->pages)->extract;
ใช้ แต่ "ประกาศ: พยายามที่จะรับทรัพย์สินที่ไม่ใช่วัตถุ" ยังคงมา
จริงๆแล้วมีเสาดีมากเรียกว่าสารสกัดที่สามารถใช้กับแบบสอบถามที่ออกแบบมาโดยเฉพาะสำหรับวัตถุประสงค์นี้ สารสกัดช่วยให้คุณได้รับสารสกัดจากบทความ (ข้อความบทความที่ถูกตัดทอน) มีพารามิเตอร์ที่เรียกว่าexintroที่สามารถใช้เพื่อดึงข้อความในส่วนศูนย์ (ไม่มีสินทรัพย์เพิ่มเติมเช่นภาพหรือกล่องข้อมูล) นอกจากนี้คุณยังสามารถดึงข้อมูลสารสกัดด้วยความละเอียดปลีกย่อยเช่นจำนวนอักขระ ( exchangears ) หรือจำนวนประโยค ( exsentences )
ต่อไปนี้เป็นตัวอย่างแบบสอบถาม http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow และAPI Sandbox API http://en.wikipedia.org/wiki/ พิเศษ: ApiSandbox # action = query & prop = แยก & format = json & exintro = & title = สแต็ค% 20Overflowเพื่อทดลองเพิ่มเติมกับแบบสอบถามนี้
โปรดทราบว่าหากคุณต้องการย่อหน้าที่หนึ่งโดยเฉพาะคุณยังต้องทำการแยกวิเคราะห์เพิ่มเติมตามที่แนะนำในคำตอบที่เลือก ความแตกต่างที่นี่คือการตอบสนองที่ส่งกลับโดยแบบสอบถามนี้จะสั้นกว่าแบบสอบถาม api อื่น ๆ ที่แนะนำเพราะคุณไม่มีเนื้อหาเพิ่มเติมเช่นรูปภาพในการตอบสนอง api เพื่อแยกวิเคราะห์
ตั้งแต่ปี 2560 Wikipedia ได้จัดทำREST APIด้วยการแคชที่ดีขึ้น ในเอกสารคุณสามารถค้นหา API ต่อไปนี้ซึ่งเหมาะกับกรณีการใช้งานของคุณ (เนื่องจากมีการใช้งานคุณลักษณะการแสดงตัวอย่างหน้าใหม่)
https://en.wikipedia.org/api/rest_v1/page/summary/Stack_Overflow
ส่งคืนข้อมูลต่อไปนี้ซึ่งสามารถใช้เพื่อแสดงหน้าร้อนที่มีภาพขนาดเล็ก:
{
"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"
}
}
ตามค่าเริ่มต้นจะติดตามการเปลี่ยนเส้นทาง (เพื่อให้ใช้/api/rest_v1/page/summary/StackOverflow
งานได้) แต่สามารถปิดใช้งานได้?redirect=false
หากคุณต้องการเข้าถึง API จากโดเมนอื่นคุณสามารถตั้งค่าส่วนหัว CORS ด้วย&origin=
(เช่น&origin=*
)
อัปเดต 2019: API ดูเหมือนจะส่งคืนข้อมูลที่เป็นประโยชน์เพิ่มเติมเกี่ยวกับหน้านี้
"other_tags" : "\"addr:country\"=>\"CW\",\"historic\"=>\"ruins\",\"name:nl\"=>\"Riffort\",\"wikidata\"=>\"Q4563360\",\"wikipedia\"=>\"nl:Riffort\""
เราจะได้รับสารสกัดจาก QID ตอนนี้หรือไม่
รหัสนี้ช่วยให้คุณสามารถดึงเนื้อหาของย่อหน้าแรกของหน้าในข้อความธรรมดา
ส่วนหนึ่งของคำตอบนี้มาจากที่นี่และทำให้ที่นี่ ดูเอกสารประกอบ MediaWiki APIสำหรับข้อมูลเพิ่มเติม
// 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.
}
ใช่แล้ว ตัวอย่างเช่นหากคุณต้องการรับเนื้อหาของส่วนแรกของบทความStack Overflowให้ใช้แบบสอบถามดังนี้:
ชิ้นส่วนหมายถึงสิ่งนี้:
format=xml
: ส่งคืนตัวจัดรูปแบบผลลัพธ์เป็น XML ตัวเลือกอื่น ๆ (เช่น JSON) สิ่งนี้จะไม่ส่งผลกระทบต่อรูปแบบของเนื้อหาของหน้าตัวเองเพียง แต่รูปแบบข้อมูลที่ล้อมรอบ
action=query&prop=revisions
: รับข้อมูลเกี่ยวกับการแก้ไขหน้า เนื่องจากเราไม่ได้ระบุการแก้ไขใดจะใช้การปรับปรุงล่าสุด
titles=Stack%20Overflow
: Stack Overflow
ได้รับข้อมูลเกี่ยวกับหน้า |
มันเป็นไปได้ที่จะได้รับข้อความของหน้ามากขึ้นในหนึ่งไปถ้าคุณแยกชื่อของพวกเขาโดย
rvprop=content
: ส่งคืนเนื้อหา (หรือข้อความ) ของการแก้ไข
rvsection=0
: ส่งคืนเฉพาะเนื้อหาจากส่วน 0
rvparse
: ส่งคืนเนื้อหาที่แยกวิเคราะห์เป็น HTML
โปรดทราบว่าสิ่งนี้จะส่งคืนส่วนแรกทั้งหมดรวมถึงสิ่งต่างๆเช่นความเกลียดชัง ("สำหรับการใช้งานอื่น ๆ ... "), กล่องข้อมูลหรือรูปภาพ
มีหลายไลบรารีสำหรับภาษาต่าง ๆ ที่ทำให้การทำงานกับ API ง่ายขึ้นมันอาจจะดีกว่าถ้าคุณใช้หนึ่งในนั้น
&redirects=true
ที่ส่วนท้ายของลิงค์ช่วยให้คุณไปถึงบทความปลายทางหากมีอยู่
นี่คือรหัสที่ฉันใช้ในขณะนี้สำหรับเว็บไซต์ที่ฉันกำลังทำอยู่ซึ่งจำเป็นต้องได้รับย่อหน้า / สรุป / ตอนที่ 0 จากบทความ Wikipedia และมันทำเสร็จแล้วภายในเบราว์เซอร์ (จาวาสคริปต์ฝั่งไคลเอ็นต์) ต้องขอบคุณ magick ของ JSONP! -> http://jsfiddle.net/gautamadude/HMJJg/1/
โดยใช้ Wikipedia API เพื่อรับย่อหน้านำหน้า (เรียกว่าส่วนที่ 0) ในรูปแบบ HTML ดังนี้: http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Stack_Overflow&prop=text§ion=0&callback=?
จากนั้นจะตัดแถบ HTML และข้อมูลที่ไม่ต้องการอื่น ๆ ให้สตริงของบทสรุปบทความที่ชัดเจนหากคุณต้องการปรับเปลี่ยนเล็กน้อยให้ได้แท็ก html "p" รอบย่อหน้านำหน้า แต่ตอนนี้มีเพียงบรรทัดใหม่ ตัวละครระหว่างพวกเขา
รหัส:
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
}
});
URL นี้จะส่งคืนข้อมูลสรุปในรูปแบบ xml
http://lookup.dbpedia.org/api/search.asmx/KeywordSearch?QueryString=Agra&MaxHits=1
ฉันได้สร้างฟังก์ชั่นเพื่อดึงคำอธิบายคำค้นหาจากวิกิพีเดีย
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');
นอกจากนี้คุณยังจะได้รับเนื้อหาเช่น pagagraph แรกผ่านDBPediaซึ่งจะนำเนื้อหาวิกิพีเดียและสร้างข้อมูลโครงสร้างจากมัน (RDF) และทำให้มีนี้ผ่านทาง API DBPedia API เป็นหนึ่ง SPARQL (ตาม RDF) แต่มันออก JSON และมันเป็นเรื่องง่ายที่จะห่อ
เป็นตัวอย่างของไลบรารี JS ที่ง่ายสุดชื่อ WikipediaJS ที่สามารถแยกเนื้อหาที่มีโครงสร้างรวมถึงย่อหน้าแรกที่สรุป: http://okfnlabs.org/wikipediajs/
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับมันในโพสต์บล็อกนี้: http://okfnlabs.org/blog/2012/09/10/wikipediajs-a-javascript-library-for-accessing-wikipedia-article-information.html
รหัสไลบรารี JS สามารถพบได้ที่นี่: https://github.com/okfn/wikipediajs/blob/master/wikipedia.js
abstract.xml.gz
การถ่ายโอนข้อมูลเสียงเหมือนคนที่คุณต้องการ
หากคุณกำลังมองหาข้อความที่คุณสามารถแยกออก แต่ไม่ต้องการใช้ API ลองดูที่ en.wikipedia.org/w/index.php?title=Elephant&action=raw
วิธีการของฉันเป็นดังนี้ (ใน 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
อาจจำเป็นต้องทำความสะอาดเพิ่มเติม แต่โดยพื้นฐานแล้ว
ฉันลอง @Michael Rapadas และโซลูชันของ @ Krinkle แต่ในกรณีของฉันฉันมีปัญหาในการหาบทความบางอย่างขึ้นอยู่กับการใช้อักษรตัวพิมพ์ใหญ่ ชอบที่นี่:
หมายเหตุฉันตัดทอนการตอบกลับด้วย exsentences=1
เห็นได้ชัดว่า "การทำให้เป็นมาตรฐานของชื่อเรื่อง" ทำงานไม่ถูกต้อง:
การปรับมาตรฐานของชื่อเรื่องจะแปลงชื่อหน้าเป็นรูปแบบมาตรฐาน นี่หมายถึงการใช้อักษรตัวแรกแทนการขีดเส้นใต้ด้วยช่องว่างและเปลี่ยนเนมสเปซเป็นรูปแบบการแปลที่กำหนดไว้สำหรับวิกินั้น การปรับมาตรฐานชื่อเรื่องให้อัตโนมัติโดยไม่คำนึงว่าจะใช้โมดูลการสืบค้นใด อย่างไรก็ตามตัวแบ่งบรรทัดต่อท้ายใด ๆ ในชื่อหน้า (\ n) จะทำให้เกิดพฤติกรรมแปลก ๆ และควรถูกแยกออกก่อน
ฉันรู้ว่าฉันสามารถแยกแยะปัญหาเรื่องการใช้อักษรตัวพิมพ์ใหญ่ได้อย่างง่ายดาย แต่ก็ยังมีความไม่สะดวกที่ต้องส่งวัตถุไปยังอาร์เรย์
ดังนั้นเพราะฉันแค่ต้องการย่อหน้าแรกของการค้นหาที่เป็นที่รู้จักและกำหนด (ไม่มีความเสี่ยงในการดึงข้อมูลจากบทความอื่น) ฉันทำแบบนี้:
https://en.wikipedia.org/w/api.php?action=opensearch&search=led%20zeppelin&limit=1&format=json
หมายเหตุในกรณีนี้ฉันได้ตัดทอนด้วย limit=1
ทางนี้:
แต่เราต้องระมัดระวังด้วยการใช้อักษรตัวใหญ่ของการค้นหาของเรา
ข้อมูลเพิ่มเติม: https://www.mediawiki.org/wiki/API:Opensearch