Получить первые строки статьи Википедии

Я получил статью из Википедии и хочу получить первые 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 Параметр возвращает только первый (нулевой) раздел статьи.

Пример: api.php? Action = query & prop = extracts & exintro & объяснительный текст & title = Albert% 20Einstein

Есть и другие параметры:

  • 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 Ссылка на контент (просто работает в браузере)

Вам нужен парсер, который может читать разметку Википедии. Попробуйте WikiText или парсеры, которые поставляются с XWiki.

Это позволит вам игнорировать все, что вам не нужно (заголовки, таблицы).

Я открыл статью об Альберте Эйнштейне в Firefox и нажал на View source. С парсером HTML это довольно легко разобрать. Вы должны сосредоточиться на <p> и удалите другой HTML из него.

Что ж, при использовании самого источника Wiki вы можете просто удалить все шаблоны в начале. Это может работать достаточно хорошо для большинства статей, в которых есть инфобокс или некоторые сообщения вверху.

Тем не менее, некоторые статьи могут помещать начальную рекламу в сам шаблон, так что это будет немного сложнее.

Другой способ, возможно, более надежный, состоит в том, чтобы взять содержимое первого <p> тег, который появляется непосредственно в тексте статьи (поэтому не вкладывается в таблицу или около того). Это должно убрать инфобоксы и другие вещи в начале, так как они, вероятно, (я не совсем уверен) <table>с или <div>s.

Как правило, Википедия написана для потребления человеком с минимальной поддержкой чего-либо семантического. Это делает автоматическое извлечение конкретной информации из статей довольно болезненным.

Как и следовало ожидать, вам, вероятно, придется в конечном итоге анализировать исходный код, скомпилированный HTML или и то, и другое. Тем не менее, раздел Wikipedia: Lead_section может дать вам некоторое представление о том, чего ожидать в хорошо написанных статьях.

Другие вопросы по тегам