2010-12-16 2 views
29

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

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

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

+2

'urllib' для получения страницы и' BeautifulSoup' для парсинга HTML. Хотя есть и другие способы сделать это, найдите их в StackOverflow. Это обсуждалось много раз. – user225312

+0

какая разметка вы хотите? mediawiki, html? – khachik

+0

HTML. (Ограничение 15 символов) –

ответ

37

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

        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 
+1

В http://pastebin.com/FVDxLWNG #REDIRECT не работает для it.wikipedia.org, его нужно перевести на итальянский, например, #RINVIA. Я подозреваю, что #REDIRECT работает только для английского. –

+0

+1 для функции «незадействования». Действительно мило. – HerrKaputt

0

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

+0

Я очень рад разобрать html вручную. hoooo yeahhh – dzen

2

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

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

+0

using BeautifulSoup – dheerosaur

+0

вероятно wikipedia блокирует некоторый useragent :) – dzen

2

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

Вот предыдущий вопрос, который может быть полезен: Fetch a Wikipedia article with Python

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

Is there a Wikipedia API?

1

Как говорили другие, одним из способов является использование wikimedia 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:] 

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

9

То, что я сделал это:

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 
34

Я написал библиотеку 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 из API MediaWiki, который возвращает мобильные дружественные версии статей Википедии. Чтобы быть конкретным, передавая параметры prop=extracts&exsectionformat=plain, серверы MediaWiki будут анализировать Викитекс и возвращать текстовую сводку статьи, которую вы запрашиваете, вплоть до текста всей страницы. Он также принимает параметры exchars и exsentences, что, что неудивительно, ограничивает количество символов и предложений, возвращаемых API.

+3

Библиотека очень хорошо разработана и довольно проста в использовании! Отличная работа. :) – Kitchi

+0

Могу ли я заставить работать за прокси? – kuroop

+0

'prop = extracts' был отключен от MobileFrontend в отдельном расширении [TextExtracts] (https://www.mediawiki.org/wiki/Extension:TextExtracts#API) в 2014 году, но вызов API не изменился. – skierpage

0

Пробег: pattern.

pip install pattern 

from pattern.web import Wikipedia 
article = Wikipedia(language="af").search('Kaapstad', throttle=10) 
print article.string 
6

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 запросить эту информацию
  • (бывшие) предложения = 2, (ех) интро = (ех) открытым текстом, являются параметрами модуля (см. первую ссылку для своего API-документа), запрашивая два предложения из вставки в виде обычного текста; оставьте это для HTML.
  • redirects= (правда), так что если вы просите «название = Эйнштейн» вы получите страницу Информации о
  • formatversion=2 Альберта Эйнштейна для более чистого формата в UTF-8.

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

Page info in search results обсуждает получение этого фрагмента текста, а также получение описания и изображения для статей.

Смежные вопросы