Извлечь первый абзац из статьи в Википедии (Python) - PullRequest
35 голосов
/ 16 декабря 2010

Как мне извлечь первый абзац из статьи в Википедии, используя Python?

Например, для Альберт Эйнштейн , это будет:

Альберт Эйнштейн (произносится / ˈælbərt ˈaɪnstaɪn /; немецкий: [ˈalbɐt ˈaɪnʃtaɪn] (слушайте); 14 марта 1879 - 18 апреля 1955) был физиком-теоретиком, философом и автором, которого многие считают одним из самых влиятельных и знаковых ученых и интеллектуаловза все время.Немецко-швейцарский нобелевский лауреат, Эйнштейн часто считается отцом современной физики. [2]Он получил Нобелевскую премию по физике 1921 года «за заслуги в теоретической физике и особенно за открытие закона фотоэлектрического эффекта». [3]

Ответы [ 10 ]

40 голосов
/ 22 октября 2013

Я написал библиотеку Python, цель которой - сделать это очень просто.Проверьте это на Github .

Чтобы установить его, запустите

$ pip install wikipedia

Затем, чтобы получить первый абзац статьи, просто используйте функцию wikipedia.summary.

>>> import wikipedia
>>> print wikipedia.summary("Albert Einstein", sentences=2)

отпечатки

Альберт Эйнштейн (/ ˈælbərt ˈaɪnstaɪn /; немецкий: [ˈalbɐt ˈaɪnʃtaɪn] (слушайте); 14 марта 1879 - 18 апреля 1955 года) родился в Германиифизик-теоретик, разработавший общую теорию относительности, один из двух столпов современной физики (наряду с квантовой механикой).Хотя он наиболее известен своей формулой эквивалентности массы и энергии E = mc2 (которая была названа «самым известным уравнением в мире»), он получил Нобелевскую премию по физике 1921 года за свои заслуги в области теоретической физики и особенно за открытиеЗакон фотоэффекта ".

Насколько это работает, wikipedia делает запрос к Mobile Frontend Extension MediaWiki API, который возвращает мобильные дружественные версиистатей в Википедии.А именно, передавая параметры prop=extracts&exsectionformat=plain, серверы MediaWiki будут анализировать Викитекст и возвращать текстовое резюме запрашиваемой статьи, вплоть до всего текста страницы.Он также принимает параметры exchars и exsentences, которые, что неудивительно, ограничивают количество символов и предложений, возвращаемых API.

38 голосов
/ 16 декабря 2010

Некоторое время назад я сделал два класса для получения статей из Википедии в виде простого текста. Я знаю, что это не лучшее решение, но вы можете адаптировать его под свои нужды:

wikipedia.py
wiki2plain.py

Вы можете использовать это так:

from wikipedia import Wikipedia
from wiki2plain import Wiki2Plain

lang = 'simple'
wiki = Wikipedia(lang)

try:
    raw = wiki.article('Uruguay')
except:
    raw = None

if raw:
    wiki2plain = Wiki2Plain(raw)
    content = wiki2plain.text
10 голосов
/ 21 мая 2011

Что я сделал, это:

import urllib
import urllib2
from BeautifulSoup import BeautifulSoup

article= "Albert Einstein"
article = urllib.quote(article)

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')] #wikipedia needs this

resource = opener.open("http://en.wikipedia.org/wiki/" + article)
data = resource.read()
resource.close()
soup = BeautifulSoup(data)
print soup.find('div',id="bodyContent").p
9 голосов
/ 11 ноября 2015

Википедия запускает расширение MediaWiki, которое предоставляет именно эту функциональность в виде модуля API. TextExtracts реализует action=query&prop=extracts с вариантами возврата первых N предложений и / или просто введения в виде HTML или обычного текста.

Вот требуемый вызов APIчтобы сделать, попробуйте: https://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Albert%20Einstein&exintro=&exsentences=2&explaintext=&redirects=&formatversion=2

  • action=query&prop=extracts, чтобы запросить эту информацию
  • (ex) предложений = 2, (ex) intro =, (ex) открытого текста, являютсяпараметры модуля (см. первую ссылку на документацию по API), запрашивающие два предложения из вступления в виде простого текста;оставьте последнее для HTML.
  • redirects= (true), поэтому, если вы спросите "title = Einstein", вы получите информацию о странице Альберта Эйнштейна
  • formatversion=2 для более чистогоформат в UTF-8.

Существуют различные библиотеки, которые оборачивают вызов API действий MediaWiki, например, в ответе DGund, но сделать вызовы API самостоятельно не так сложно.

Информация о странице в результатах поиска обсуждает получение этого извлечения текста, а также получение описания и ведущего изображения для статей.

2 голосов
/ 16 декабря 2010

Во-первых, я обещаю, что я не извращенец.

Вот предыдущий вопрос, который может быть полезен: Получить статью из Википедии с Python

В этом кто-то предлагает использовать API высокого уровня Википедии, что приводит к этому вопросу:

Есть ли в Википедии API?

2 голосов
/ 16 декабря 2010

Если вам нужны предложения библиотеки, на ум приходит BeautifulSoup , urllib2 .Ответил на SO раньше: Соскоб в сети с Python .

Я попробовал urllib2, чтобы получить страницу из Википедии.Но это было 403 (запрещено).MediaWiki предоставляет API для Википедии, поддерживающий различные форматы вывода.Я не использовал python-wikitools, но, возможно, стоит попробовать.http://code.google.com/p/python-wikitools/

1 голос
/ 07 июня 2018

Относительно новый REST API имеет метод summary, который идеально подходит для этого использования, и выполняет много вещей, упомянутых в других ответах здесь (например, удаление викикода).Он даже включает изображение и геокоординаты, если это применимо.

Использование прекрасного модуля requests и Python 3:

import requests
r = requests.get("https://en.wikipedia.org/api/rest_v1/page/summary/Amsterdam")
page = r.json()
print(page["extract"]) # Returns 'Amsterdam is the capital and...'
1 голос
/ 21 декабря 2010

Как уже говорили другие, один из подходов заключается в использовании API Викимедиа и urllib или urllib2.Приведенные ниже фрагменты кода являются частью того, что я использовал для извлечения так называемого «ведущего» раздела, в котором есть аннотация статьи и информационный блок.Это проверит, является ли возвращаемый текст перенаправлением вместо реального содержимого, а также позволит вам пропустить информационный блок, если он присутствует (в моем случае я использовал другой код для извлечения и форматирования информационного блока.

contentBaseURL='http://en.wikipedia.org/w/index.php?title='

def getContent(title):
    URL=contentBaseURL+title+'&action=raw&section=0'
    f=urllib.urlopen(URL)
    rawContent=f.read()
    return rawContent

infoboxPresent = 0
# Check if a redirect was returned.  If so, go to the redirection target
    if rawContent.find('#REDIRECT') == 0:
        rawContent = getFullContent(title)
        # extract the redirection title
        # Extract and format the Infobox
        redirectStart=rawContent.find('#REDIRECT[[')+11   
        count = 0
        redirectEnd = 0
        for i, char in enumerate(rawContent[redirectStart:-1]):
            if char == "[": count += 1
            if char == "]}":
                count -= 1
                if count == 0:
                    redirectEnd = i+redirectStart+1
                    break
        redirectTitle = rawContent[redirectStart:redirectEnd]
        print 'redirectTitle is: ',redirectTitle
        rawContent = getContent(redirectTitle)

    # Skip the Infobox
    infoboxStart=rawContent.find("{{Infobox")   #Actually starts at the double {'s before "Infobox"
    count = 0
    infoboxEnd = 0
    for i, char in enumerate(rawContent[infoboxStart:-1]):
        if char == "{": count += 1
        if char == "}":
            count -= 1
            if count == 0:
                infoboxEnd = i+infoboxStart+1
                break

    if infoboxEnd <> 0:
        rawContent = rawContent[infoboxEnd:]

ВыЯ вернусь к необработанному тексту, включая вики-разметку, поэтому вам нужно выполнить некоторую очистку. Если вам нужен только первый абзац, а не весь первый раздел, найдите первый символ новой строки.

0 голосов
/ 22 июля 2014

Попробуйте pattern.

pip install pattern

from pattern.web import Wikipedia
article = Wikipedia(language="af").search('Kaapstad', throttle=10)
print article.string
0 голосов
/ 16 декабря 2010

Попробуйте использовать комбинацию urllib для загрузки сайта и BeautifulSoup или lxml для анализа данных.

...