Извлеките первый абзац из статьи в Википедии (Python)
Как я могу извлечь первый абзац из статьи в Википедии, используя Python?
Например, для Альберта Эйнштейна это будет:
Альберт Эйнштейн (произносится/ælbərt aɪnstaɪn/; Немецкий: [albɐt aɪnʃtaɪn] ( Слушать); 14 марта 1879 года - 18 апреля 1955) был физиком-теоретиком, философа и автора, который широко считается одним из самых влиятельных и знаковых ученых и интеллектуалы всех времен. Немецко-швейцарский лауреат Нобелевской премии, Эйнштейн часто считается отцом современная физика. [2] Он получил 1921 Нобелевская премия по физике "за его услуг теоретической физике и особенно за его открытие закон фотоэффекта". [3]
Ответы
Ответ 1
Некоторое время назад я сделал два класса для получения статей в Википедии в виде простого текста. Я знаю, что это не лучшее решение, но вы можете адаптировать его к вашим потребностям:
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
Ответ 2
Я написал библиотеку 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
делает запрос к Расширение мобильного интерфейса API MediaWiki, который возвращает мобильные версии статей Wikipedia. Чтобы быть конкретным, передавая параметры prop=extracts&exsectionformat=plain
, серверы MediaWiki будут анализировать Викитекс и возвращать текстовую сводку статьи, которую вы запрашиваете, вплоть до текста всей страницы. Он также принимает параметры exchars
и exsentences
, что, что неудивительно, ограничивает количество символов и предложений, возвращаемых API.
Ответ 3
Я сделал следующее:
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
Ответ 4
Wikipedia запускает расширение 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) sentences = 2, (ex) intro =, (ex) plaintext, являются параметрами модуля (см. первую ссылку для своего API-документа), запрашивая два предложения из intro как обычный текст; оставьте последний для HTML.
-
redirects=
(true), поэтому, если вы попросите "titles = Einstein", вы получите информацию о странице Альберта Эйнштейна.
-
formatversion=2
для более чистого формата в UTF-8.
Существуют различные библиотеки, которые переносят вызов API-интерфейсов MediaWiki, таких как ответ в DGund, но не слишком сложно заставить API называть себя.
Информация о странице в результатах поиска обсуждает получение этого фрагмента текста, а также получение описания и руководства для статей.
Ответ 5
Если вам нужны предложения библиотеки, BeautifulSoup, urllib2 приходят на ум.
Ответил на SO before: Веб-скребок с Python.
Я попробовал urllib2, чтобы получить страницу из Википедии. Но это было 403 (запрещено). MediaWiki предоставляет API для Википедии, поддерживая различные форматы вывода. Я не использовал python-wikitools, но, возможно, стоит попробовать. http://code.google.com/p/python-wikitools/
Ответ 6
Во-первых, я обещаю, что не зря.
Вот предыдущий вопрос, который может быть полезен:
Получить статью в Википедии с помощью Python
В этом кто-то предлагает использовать API высокого уровня wikipedia, что приводит к этому вопросу:
Есть ли API Википедии?
Ответ 7
Как говорили другие, одним из подходов является использование wikimedia API и urllib или urllib2. Описанные ниже фрагменты кода являются частью того, что я использовал для извлечения так называемого "ведущего" раздела, в котором содержится статья и инфобокс. Это проверяет, является ли возвращенный текст перенаправлением вместо фактического содержимого, а также позволяет пропускать инфобокс, если он присутствует (в моем случае я использовал другой код для вытягивания и форматирования инфобокса.
contentBaseURL='http://en.wikipedia.org/w/index.php?title='
def getContent(title):
URL=contentBaseURL+title+'&action=raw§ion=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 { 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:]
Вы получите исходный текст, включая разметку wiki, поэтому вам нужно будет немного очистить. Если вам нужен только первый абзац, а не весь первый раздел, найдите первый новый символ строки.
Ответ 8
Попробуйте комбинацию urllib
для извлечения сайта и BeautifulSoup
или lxml
для анализа данных.
Ответ 9
Попробуйте pattern
.
pip install pattern
from pattern.web import Wikipedia
article = Wikipedia(language="af").search('Kaapstad', throttle=10)
print article.string