In [59]:
import BeautifulSoup as bs
from IPython.display import HTML
import urllib2
import re
In [80]:
url = 'http://pt.wikipedia.org/w/index.php?title=Wikip%C3%A9dia:Esplanada/geral&action=history'
headers = { 'User-Agent' : 'Mozilla/5.0' }
req = urllib2.Request(url, None, headers)
html = urllib2.urlopen(req).read()
soup = bs.BeautifulSoup(html)
topics = soup.findAll('li', text=re.compile(u'\(novo tópico:*'))
topics_l = []
for topic in topics:
    topics_l.append({})
    t = topic.findParent() 
    topics_l[-1]['title'] = t.findAll('a')[1]
    topics_l[-1]['author'] = t.findParent().find('span', attrs={'class': 'history-user'}).a
    topics_l[-1]['date'] = t.findParent().find('a', attrs={'class': 'mw-changeslist-date'})

def html_new_topics(topics):
    html_list = '<h2>{} novos tópicos</h2><ul>'.format(len(topics))
    for topic in topics:
        html_list += '<li>'
        for k in topic.keys():
            topic[k]['href'] = 'http://pt.wikipedia.org' + str(topic[k]['href'])
        html_list += str(topic['title']) + ' - ' + str(topic['author']) + ' - ' + str(topic['date'])
        html_list += '</li>'
    html_list += '</ul>'
    return html_list
        
HTML(html_new_topics(topics_l))
Out[80]:

35 novos tópicos

Agora vamos tentar extrair o início da página de cada novo tópico. Para isso teremos que ir link por link da lista acima, fazer um novo request com urllib2 e fazer o parsing com BeautifulSoup. Bom, primeiro alguns experimentos:

In [33]:
url = topics_l[0]['title']['href']
headers = { 'User-Agent' : 'Mozilla/5.0' }
req = urllib2.Request(url, None, headers)
html = urllib2.urlopen(req).read()
soup = bs.BeautifulSoup(html)
In [35]:
len(cont_div.findAll(text=True))
Out[35]:
131
In [45]:
cont_div = soup.find('div', attrs={'id': 'mw-content-text'})
for i in cont_div:
    if type(i) == bs.Tag:
        if i.name != 'table' and i.name != 'dl':
            print i
        if i.name == 'dl':
            break
<p>Pelo <a href="/wiki/Wikip%C3%A9dia:CDN/EF" title="Wikipédia:CDN/EF" class="mw-redirect">Critério de notoriedade sobre elementos de ficção</a>, para cada obra de ficção podemos criar listas para personagens (inclusive secundários), lugares, espécies de animais, robôs, objetos, conceitos, golpes, etc. O CDN fala para fazer a fusão de praticamente qualquer elemento de ficção. Nesse caso, marcações de ESR (e PE também?) em elementos de ficção não deviam ser sempre impugnadas e levar para a Central de fusão? Ou ao menos a maioria, já q mesmo sem fontes quase sempre tem iw com fontes mostrando q existe, e mesmo se não tiver é um elemento de ficção. <a href="/wiki/Usu%C3%A1rio:Rjclaudio" title="Usuário:Rjclaudio">Rjclaudio</a> <sup><a href="/wiki/Usu%C3%A1rio_Discuss%C3%A3o:Rjclaudio" title="Usuário Discussão:Rjclaudio">msg</a></sup> 12h00min de 26 de janeiro de 2013 (UTC)</p>
In [81]:
def html_new_topics(topics, content=False):
    html_list = '<h2>{} novos tópicos</h2><ul>'.format(len(topics))
    for topic in topics:
        if content:
            url = topic['title']['href']
            headers = { 'User-Agent' : 'Mozilla/5.0' }
            req = urllib2.Request(url, None, headers)
            html = urllib2.urlopen(req).read()
            soup = bs.BeautifulSoup(html)
            cont_div = soup.find('div', attrs={'id': 'mw-content-text'})
            
            topic_content = ''
            for i in cont_div:
                if type(i) == bs.Tag:
                    if i.name != 'table' and i.name != 'dl':
                        topic_content += str(i)
                    if i.name == 'dl':
                        break
        
        html_list += '<li style="border: 1px solid black;">'
        html_list += '{} - {} - {}'.format(topic['title'], topic['author'], topic['date'])
        if content:
           html_list += '<br/>' + topic_content 
        html_list += '</li>'
    html_list += '</ul>'
    return html_list
In [82]:
HTML(html_new_topics(topics_l, content=True))
Out[82]:

35 novos tópicos