Получить первые строки статьи Википедии
Я получил статью из Википедии и хочу получить первые z строки (или первые x символов, или первые y слов, не имеет значения) из статьи.
Проблема: я могу получить исходный текст Wiki (через API) или проанализированный HTML (через прямой HTTP-запрос, в конце концов, в версии для печати), но как найти первые отображаемые строки? Обычно источник (как html, так и wikitext) начинается с информационных блоков и изображений, и первый реальный текст для отображения находится где-то внизу кода.
Например: Альберт Эйнштейн в Википедии (версия для печати). Посмотрите в коде, первая реальная текстовая строка "Альберт Эйнштейн (произносится /ˈælbərt ˈaɪnstaɪn/; немецкий язык: [ˈalbɐt ˈaɪ̯nʃtaɪ̯n]; 14 марта 1879–18 апреля 1955 года) был физиком-теоретиком". не на старте. То же самое относится и к Wiki-Source, оно начинается с того же информационного блока и так далее.
Итак, как бы вы справились с этой задачей? Язык программирования - Java, но это не должно иметь значения.
Решение, которое мне пришло в голову, состояло в том, чтобы использовать запрос xpath, но этот запрос был бы довольно сложным для обработки всех пограничных случаев. [обновление] Это было не так сложно, смотрите мое решение ниже![/update]
Спасибо!
9 ответов
Я разработал следующее решение:Используя xpath-запрос к XHTML-Source-Code (я взял версию для печати, потому что она короче, но она также работает и в обычной версии).
//html/body//div[@id='bodyContent']/p[1]
Это работает на немецком и на английском Википедии, и я не нашел статью, где не выводится первый абзац. Решение также довольно быстрое, я также думал о том, чтобы взять только первые x символов 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");
Вам не нужно.
API exintro
Параметр возвращает только первый (нулевой) раздел статьи.
Есть и другие параметры:
exchars
Длина выдержки в символах.exsentences
Количество предложений для возврата.exintro
Вернуть только нулевой раздел.exsectionformat
Какой формат заголовка раздела использовать для извлечения открытого текста:wiki — e.g., == Wikitext == plain — no special decoration raw — this extension's internal representation
exlimit
Максимальное количество экстрактов для возврата. Поскольку генерация выдержек может быть медленной, ограничение ограничено 20 для выдержек только для интро и 1 для выдержек на целую страницу.explaintext
Вернуть текстовые выдержки.excontinue
Если доступно больше результатов, используйте этот параметр для продолжения.
Источник: https://www.mediawiki.org/wiki/Extension:MobileFrontend
Я также нуждался в этом и написал некоторый код Python для этого.
Сценарий загружает статью из Википедии с указанным именем, анализирует ее с помощью BeautifulSoup и возвращает первые несколько абзацев.
Код находится по адресу http://github.com/anandology/sandbox/blob/master/wikisnip/wikisnip.py.
Википедия предлагает скачать тезисы. Хотя это довольно большой файл (в настоящее время 2.5GB
), он предлагает именно ту информацию, которую вы хотите, для всех статей.
Например, если у вас есть результат в строке, вы найдете текст:
<div id="bodyContent">
и после этого индекса вы найдете первый
<p>
это будет индекс первого упомянутого вами абзаца.
попробуй этот URL Ссылка на контент (просто работает в браузере)
Я открыл статью об Альберте Эйнштейне в Firefox и нажал на View source. С парсером HTML это довольно легко разобрать. Вы должны сосредоточиться на <p>
и удалите другой HTML из него.
Что ж, при использовании самого источника Wiki вы можете просто удалить все шаблоны в начале. Это может работать достаточно хорошо для большинства статей, в которых есть инфобокс или некоторые сообщения вверху.
Тем не менее, некоторые статьи могут помещать начальную рекламу в сам шаблон, так что это будет немного сложнее.
Другой способ, возможно, более надежный, состоит в том, чтобы взять содержимое первого <p>
тег, который появляется непосредственно в тексте статьи (поэтому не вкладывается в таблицу или около того). Это должно убрать инфобоксы и другие вещи в начале, так как они, вероятно, (я не совсем уверен) <table>
с или <div>
s.
Как правило, Википедия написана для потребления человеком с минимальной поддержкой чего-либо семантического. Это делает автоматическое извлечение конкретной информации из статей довольно болезненным.
Как и следовало ожидать, вам, вероятно, придется в конечном итоге анализировать исходный код, скомпилированный HTML или и то, и другое. Тем не менее, раздел Wikipedia: Lead_section может дать вам некоторое представление о том, чего ожидать в хорошо написанных статьях.