John Mayer - Gravity

John Clayton Mayer é um cantor, compositor e produtor musical norte-americano. Nascido em Bridgeport, no estado de Connecticut, ele estudou na Berklee College of Music. Autor de músicas que ganharam o Grammy Awards como Your Body Is A Wonderland. Comecou tocando rock, mas foi transitando para o blues. Já colaborou com artistas renomados do blues como B.B. King e Eric Clapton.


In [1]:
# Importando a biblioteca Requests
import requests

url = "https://www.letras.mus.br/john-mayer/420168/"

r = requests.get(url)

type(r)


Out[1]:
requests.models.Response

Ao examinarmos a chamada da funcao requests.get() obtemos um objeto do tipo Response. Para mais informacoes e um pequeno Quickstart dessa biblioteca acesse


In [2]:
# Extrair o HTML do objeto Response e imprime
html = r.text
#print(html)

Muito bom, agora já temos todo o conteúdo da página que contem a música Gravity do John Mayer. O próximo passo é realizar o parsing ou a separacao do conteúdo da música, do restante da página. Para realizar essa tarefa vamos usar uma outra biblioteca chamada BeautifulSoup


In [3]:
# Importando a biblioteca BeautifulSoup de bs4
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html5lib")
type(soup)


Out[3]:
bs4.BeautifulSoup

Agora chegou o momento de extra informacoes relevantes da página que acabamos de coletar, como o título da página


In [4]:
soup.title


Out[4]:
<title>Gravity - John Mayer - LETRAS.MUS.BR</title>

Como podemos perceber ele retorna todo o conteúdo do título, mas é possível obter apenas a string do título da página


In [5]:
soup.title.string


Out[5]:
'Gravity - John Mayer - LETRAS.MUS.BR'

Podemos também obter uma lista com todos os hyperlinks da página, que no HTML sao declarados com a tag < a >


In [6]:
# Encontre todos os hyperlinks da nossa sopa e exibindo apenas os 10 primeiros
soup.findAll('a')[:10]


Out[6]:
[<a href="/">Letras de músicas - Letras.mus.br</a>,
 <a href="#"></a>,
 <a href="/" itemprop="item"><span itemprop="name">Página Inicial</span></a>,
 <a href="/estilos/rock-roll/" itemprop="item"><span itemprop="name">Rock and Roll</span></a>,
 <a href="/john-mayer/" itemprop="item"><span itemprop="name">John Mayer</span></a>,
 <a href="/john-mayer/"><img alt="" height="44" src="https://studiosol-a.akamaihd.net/uploadfile/letras/fotos/a/d/d/5/add5adc0fca0952804b77b1980c08658-tb.jpg" width="44"/>John Mayer</a>,
 <a class="sh-bt sh-f" data-nofollow="true" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.letras.mus.br%2Fjohn-mayer%2F420168%2F&amp;t=Gravity" rel="nofollow"></a>,
 <a class="sh-bt sh-t" data-nofollow="true" href="http://twitter.com/share?url=https%3A%2F%2Fwww.letras.mus.br%2Fjohn-mayer%2F420168%2F&amp;related=letras&amp;text=%E2%99%AB%20Gravity%20no @letras" rel="nofollow"></a>,
 <a class="sh-bt sh-g" data-nofollow="true" href="https://plus.google.com/share?hl=pt-BR&amp;url=https%3A%2F%2Fwww.letras.mus.br%2Fjohn-mayer%2F420168%2F" rel="nofollow"></a>,
 <a class="lm_lang lm_lang_pt" data-tt="Tradução" data-viaplayer="true" href="/john-mayer/420168/traducao.html"><i></i>Tradução</a>]

Muito bem, o que nós precisamos fazer agora é extrair o texto da música que é o nosso objetivo inicial, para isso o BeautifulSoup contém um método chamado .get_text()


In [7]:
# Extrair o texto da nossa sopa e imprimir
text = soup.get_text()
#print(text)

Como podemos perceber esse método retorna todo conteúdo da página inclusive códigos Javascript ou CSS. Nao é exatamente o que gostariamos de obter, o texto da música está contido nessa sopa, mas nossa colher parece grande demais para come-la ;). Analisando a página que contém o texto da música temos uma boa pista. A tag < article > parece conter todo o conteúdo da letra da música. Vamos usar entao o método .findAll() passando como parâmetro a string 'article'


In [8]:
article_tag = soup.find('article')
type(article_tag)


Out[8]:
bs4.element.Tag

In [9]:
for br_tag in article_tag.find_all('br'):
    br_tag.extract()
text = article_tag.get_text(separator=u' ', strip=True)
print(text)


Gravity is working against me And gravity wants to bring me down Oh, I'll never know what makes this man With all the love that his heart can stand Dream of ways to throw it all away Oh, gravity is working against me And gravity wants to bring me down Oh, twice as much ain't twice as good And can't sustain like a one half could It's wanting more that's gonna send me to my knees Oh, gravity stay the hell away from me Oh, gravity has taken better men than me How can that be? Just keep me where the light is Just keep me where the light is Just keep me where the light is Come on, keep me where the light is Come on, keep me where the light is Come on, keep me where, keep me where the light is

Parte 2 - Tokenizacao

Por último, vamos comecar a preparar o nosso corpus para uma posterior análise de NLP. Uma das primeiras etapas nesse processo é a etapa de tokenizacao. Para realizar isso vamos importar o módulo RegexpTokenizer da biblioteca NLTK (Natural Language Toolkit). Para mais detalhes sobre a biblioteca acesse. Existe também um livro que você pode ler aqui - http://www.nltk.org/book/


In [10]:
# Importando RegexpTokenizer de nltk.tokenize
from nltk.tokenize import RegexpTokenizer

# Criando o objeto tokenizer
tokenizer = RegexpTokenizer('\w+')

# Criando os tokens a partir do texto da música Gravity
tokens = tokenizer.tokenize(text)
tokens[:8]


Out[10]:
['Gravity', 'is', 'working', 'against', 'me', 'And', 'gravity', 'wants']

In [11]:
# Inicializando uma lista vazia que vai conter as palavras minúsculas
words = []

# Loop through list tokens and make lower case
for word in tokens:
    words.append(word.lower())

# Print several items from list as sanity check
words[:8]


Out[11]:
['gravity', 'is', 'working', 'against', 'me', 'and', 'gravity', 'wants']

That's all folks !!