Получить первые строки статьи Википедии
У меня есть статья Википедии, и я хочу получить первые строки z (или первые х-символы или первые слова y, не имеет значения) из статьи.
Проблема: я могу получить либо исходный Wiki-текст (через API), либо разобранный HTML (через прямой HTTP-запрос, в конце концов, в печатной версии), но как я могу найти первые строки, отображаемые? Нормальный источник (как html, так и wikitext) начинается с информационных полей и изображений, и первый реальный текст для отображения находится где-то в коде.
Например:
Альберт Эйнштейн в Википедии (версия для печати). Посмотрите в коде первую строку в реальном тексте "Альберт Эйнштейн (произносится/ælbərt aɪnstaɪn/; German: [albɐt aɪ̯nʃtaɪ̯n], 14 марта 1879-18 апреля 1955 года) был физиком-теоретиком". не в самом начале. То же самое относится к Wiki-Source, он начинается с того же информационного окна и т.д.
Итак, как бы вы выполнили эту задачу? Язык программирования - java, но это не имеет значения.
Решением, которое пришло мне в голову, было использование запроса xpath, но этот запрос был бы довольно сложным для обработки всех пограничных случаев. [update] Это было не так сложно, см. мое решение ниже! [/update]
Спасибо!
Ответы
Ответ 1
Я разработал следующее решение:
Использование xpath-запроса в XHTML-Source-коде (я взял версию для печати, потому что она короче, но она также работает в нормальной версии).
//html/body//div[@id='bodyContent']/p[1]
Это работает на немецком языке и в английской Википедии, и я не нашел статью, в которой он не выводит первый абзац. Решение также довольно быстро, я также думал о том, что вы принимали только первые х-символы xhtml, но это сделало бы xhtml недействительным.
Если кто-то ищет JAVA-код здесь, он:
private static DocumentBuilderFactory dbf;
static {
dbf = DocumentBuilderFactory.newInstance();
dbf.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
}
private static XPathFactory xpathf = XPathFactory.newInstance();
private static String xexpr = "//html/body//div[@id='bodyContent']/p[1]";
private static String getPlainSummary(String url) {
try {
// OPen Wikipage
URL u = new URL(url);
URLConnection uc = u.openConnection();
uc.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1) Gecko/20090616 Firefox/3.5");
InputStream uio = uc.getInputStream();
InputSource src = new InputSource(uio);
//Construct Builder
DocumentBuilder builder = dbf.newDocumentBuilder();
Document docXML = builder.parse(src);
//Apply XPath
XPath xpath = xpathf.newXPath();
XPathExpression xpathe = xpath.compile(xexpr);
String s = xpathe.evaluate(docXML);
//Return Attribute
if (s.length() == 0) {
return null;
} else {
return s;
}
}
catch (IOException ioe) {
logger.error("Cant get XML", ioe);
return null;
}
catch (ParserConfigurationException pce) {
logger.error("Cant get DocumentBuilder", pce);
return null;
}
catch (SAXException se) {
logger.error("Cant parse XML", se);
return null;
}
catch (XPathExpressionException xpee) {
logger.error("Cant parse XPATH", xpee);
return null;
}
}
используйте его, вызывая getPlainSummary("http://de.wikipedia.org/wiki/Uma_Thurman");
Ответ 2
Вам не нужно.
Параметр API exintro
возвращает только первый (нулевой) раздел статьи.
Пример: api.php? action = query & prop = extracts & exintro & explaintext & title= Albert %20Einstein
Существуют и другие параметры:
-
exchars
Длина выписок в символах.
-
exsentences
Количество предложений для возврата.
-
exintro
Возвратите только нулевую секцию.
-
exsectionformat
Какой формат заголовка раздела используется для экстентов открытого текста:
wiki — e.g., == Wikitext ==
plain — no special decoration
raw — this extension internal representation
-
exlimit
Максимальное количество выписок для возврата. Поскольку генерация выдержек может быть медленной, ограничение ограничено 20 для интро-единственных выписок и 1 для всех страниц.
-
explaintext
Вернуть текстовые выдержки.
-
excontinue
Когда доступно больше результатов, используйте этот параметр для продолжения.
Источник: https://www.mediawiki.org/wiki/Extension:MobileFrontend#prop.3Dextracts
Ответ 3
Я тоже нуждался в этом и написал код Python для этого.
script загружает статью wikipedia с заданным именем, анализирует ее с помощью BeautifulSoup и возвращает первые несколько абзацев.
Код находится в http://github.com/anandology/sandbox/blob/master/wikisnip/wikisnip.py.
Ответ 4
Википедия предлагает тезисы download. Хотя это довольно большой файл (в настоящее время 2.5GB
), он предлагает именно ту информацию, которую вы хотите, для всех статей.
Ответ 5
Вам нужен парсер, который может читать разметку Википедии. Попробуйте WikiText или парсеры, которые поставляются с XWiki.
Это позволит вам игнорировать все, что вам не нужно (заголовки, таблицы).
Ответ 6
Я открыл статью Альберта Эйнштейна в Firefox, и я нажал на View source. Это довольно легко разобрать с помощью парсера HTML. Вы должны сосредоточиться на <p>
и вырезать другой html изнутри.
Ответ 7
Например, если у вас есть результат в строке
вы найдете текст:
<div id="bodyContent">
и после этого индекса вы найдете первый
<p>
который будет индексом первого абзаца, о котором вы упомянули.
попробуйте этот URL-адрес
Ссылка на контент (работает только в браузере)
Ответ 8
Ну, при использовании самого источника Wiki вы можете просто удалить все шаблоны в начале. Это может работать достаточно хорошо для большинства статей с инфобоксами или сообщениями вверху.
Однако некоторые статьи могут помещать начальный рекламный блок в сам шаблон, так что там будет немного сложно.
Другим способом, возможно, более надежным было бы взять содержимое первого тега <p>
, который появляется непосредственно в тексте статьи (поэтому не вложен в таблицу или около того). Это должно лишить инфобокс и другие вещи в начале, поскольку они, вероятно, (я не совсем уверен) <table>
или <div>
s.
Как правило, Википедия написана для потребления человеком с минимальной поддержкой всего семантического. Это делает автоматическое извлечение определенной информации из статей довольно болезненными.
Ответ 9
Как вы ожидаете, вам, вероятно, придется разобрать исходный код, скомпилированный HTML или оба. Однако Wikipedia:Lead_section может дать вам некоторое представление о том, чего ожидать в хорошо написанных статьях.