извлечение основных абзацев из вывода страницы википедии python

Есть ли способ извлечь

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

(Весь вывод основного абзаца, видимый при запуске кода)

Автоматически из вывода следующего кода? Даже если он выведен с другой страницы википедии:

import urllib2
import re, sys
from HTMLParser import HTMLParser

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.fed = []
    def handle_data(self, d):
        self.fed.append(d)
    def get_data(self):
        return ''.join(self.fed)

def stripHTMLTags(html):
    html = re.sub(r'<{1}br{1}>', '\n', html)
    s = MLStripper()
    s.feed(html)
    text = s.get_data()
    if "External links" in text:
        text, sep, tail = text.partition('External links')
    if "External Links" in text:
        text, sep, tail = text.partition('External Links')
    text = text = text.replace("See also","\n\n See Also - \n")
    text = text.replace("*","- ")
    text = text.replace(".", ". ")
    text = text.replace("  "," ")
    text = text.replace("""   /
 / ""","")
    return text

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
infile = opener.open('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes')
page = infile.read()
print stripHTMLTags(page)

Пожалуйста, извините мое плохое форматирование, код (и, возможно, отступы), я сейчас использую 3-дюймовый дисплей и не имел возможности просмотреть свой собственный код: P.

Спасибо также людям, чьи сообщения помогли мне заставить это работать :)


person abkai    schedule 26.04.2012    source источник


Ответы (3)


Я оставляю свой ответ здесь, потому что это именно то, о чем просил ОП. Правильный способ сделать это — использовать python-wikitools, как это предлагается в ответе @ChristophD ниже.


Я немного изменил код в вашем вопросе, чтобы использовать BeautifulSoup. Существуют и другие варианты. Вы также можете попробовать lxml.

import urllib2
import re, sys
from HTMLParser import HTMLParser

# EDIT 1: import the packag
from BeautifulSoup import BeautifulSoup

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.fed = []
    def handle_data(self, d):
        self.fed.append(d)
    def get_data(self):
        return ''.join(self.fed)

def stripHTMLTags(html):
    html = re.sub(r'<{1}br{1}>', '\n', html)
    s = MLStripper()
    s.feed(html)
    text = s.get_data()
    if "External links" in text:
        text, sep, tail = text.partition('External links')
    if "External Links" in text:
        text, sep, tail = text.partition('External Links')
    text = text = text.replace("See also","\n\n See Also - \n")
    text = text.replace("*","- ")
    text = text.replace(".", ". ")
    text = text.replace("  "," ")
    text = text.replace("""   /
 / ""","")
    return text

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
infile = opener.open('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes')
page = infile.read()

# EDIT 2: convert the page and extract text from the first <p> tag
soup = BeautifulSoup(page)
para = soup.findAll("p", limit=1)[0].text

print stripHTMLTags(para)
person daedalus    schedule 26.04.2012
comment
@Спасибо! Это то, что я хотел. Огромное спасибо! :) - person abkai; 27.04.2012

Я настоятельно рекомендую не использовать html-скрапинг для любого сайта.

Это больно делать, он легко сломается, и многим владельцам сайтов это не нравится.

Используйте это (python-wikitools) для взаимодействия с API Википедии (ваш лучший выбор в долгосрочной перспективе ).

person ChristopheD    schedule 26.04.2012
comment
+1, потому что вы правы, и в качестве поощрения за создание короткого сценария для этого @ChristopheD - изучение API Википедии излишне для быстрого и грязного очистки. Но вы делаете правильный вывод, конечно. - person daedalus; 26.04.2012
comment
@gauden: спасибо за +1, завтра добавлю небольшой пример. - person ChristopheD; 27.04.2012

Следующий запрос API возвращает выдержку страницы в виде простого текста: https://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Albert%20Einstein&explaintext

person MaxSem    schedule 07.05.2012