Подтвердить что ты не робот

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

У меня есть статья Википедии, и я хочу получить первые строки 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]

Спасибо!

4b9b3361

Ответ 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 может дать вам некоторое представление о том, чего ожидать в хорошо написанных статьях.