Извлечение первого абзаца из статьи Википедии (Python)
Как я могу извлечь первый абзац из статьи Википедии, используя Python?
например,Альберт Эйнштейн что будет:
Альберт Эйнштейн (произносится как / ˈælbərt ˈaɪnstaɪn/; немецкий: [ˈalbɐt ˈaɪnʃtaɪn] ( слушаю); 14 марта 1879 – 18 апреля 1955) был физиком-теоретиком, философ и автор, который широко считается одним из самых влиятельные и знаковые ученые и интеллектуалы всех времен. Ля Немецко-швейцарский Нобелевский лауреат, Эйнштейн часто рассматривается как отец современная физика.[2] он получил 1921 Нобелевская премия по физике " за его услуги по теоретической физике, и особенно за его открытие закон фотоэффекта".[3]
10 ответов
некоторое время назад я сделал два класса для статей Википедии прямым текстом. Я знаю, что это не лучшее решение, но вы можете адаптировать его к своим потребностям:
вы можете использовать его как это:
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
Я написал библиотеку Python, которая стремится сделать это очень легко. Проверьте это на Github.
чтобы установить его, выполните команду
$ pip install wikipedia
затем, чтобы получить первый абзац статьи, просто использовать
вот что я сделал:
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
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 самостоятельно.
информация о странице в результатах поиска обсуждает получение этого извлечения текста, а также получение описания и ведущего изображения для статей.
Если вы хотите, предложения, библиотека, BeautifulSoup, urllib2 приходят на ум. Ответил на так раньше:веб-скрейпинг с Python.
Я попробовал urllib2, чтобы получить страницу из Википедии. Но, это было 403 (запрещено). MediaWiki предоставляет API для Википедии, поддерживая различные форматы вывода. Я не использовал python-wikitools, но, возможно, стоит попробовать. http://code.google.com/p/python-wikitools/
как говорили другие, один из подходов-использовать API Викимедиа и urllib или urllib2. Фрагменты кода ниже являются частью того, что я использовал для извлечения так называемого "ведущего" раздела, в котором есть аннотация статьи и infobox. Это проверит, является ли возвращаемый текст перенаправлением вместо фактического содержимого, а также позволит вам пропустить infobox, если он присутствует (в моем случае я использовал другой код для извлечения и форматирования infobox.
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 {'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:]
вы получите обратно необработанный текст включая разметку wiki, поэтому вам нужно будет сделать некоторую очистку. Если вам нужен только первый абзац, а не весь первый раздел, найдите первый новый символ строки.
попробовать pattern
.
pip install pattern
from pattern.web import Wikipedia
article = Wikipedia(language="af").search('Kaapstad', throttle=10)
print article.string
относительно новый REST API есть summary
метод, который идеально подходит для такого использования, и делает многое из того, что упоминалось в других ответов здесь (например, удаление Вики-разметку). Он даже включает изображение и geocoordinates если применимо.
используя прекрасный 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...'