2016-03-27 61 views
0

我正在寫一個程序來尋找歌詞,該程序幾乎接近完成,但我有一個小問題,bs4數據類型, 我的問題是如何從歌詞中提取純文本變量在行結束?問題提取html頁面的字符串使用bs4

import re 
import requests 
import bs4 
from urllib import unquote 

def getLink(fileName): 
    webFileName = unquote(fileName) 
    page = requests.get("http://songmeanings.com/query/?query="+str(webFileName)+"&type=songtitles")  
    match = re.search('songmeanings\.com\/[^image].*?\/"',page.content) 
    if match: 
     Mached = str("http://"+match.group()) 
     return(Mached[:-1:]) # this line used to remove a " at the end of line 
    else: 
     return(1)  

def getText(link):  
    page = requests.get(str(link))   
    soup = bs4.BeautifulSoup(page.content ,"lxml")  
    return(soup)   

Soup = getText(getLink("paranoid android")) 
lyric = Soup.findAll(attrs={"lyric-box"}) 
print (lyric) 

這裏是outout:

[\ n \ t \ t \ t \ t \ t \ t請你能制止噪音,
\ n我試圖得到一些休息
\ n從我腦中所有未出生的雞的聲音
\ n那是什麼?
\ n那是什麼?
\ n
\ n當我是國王時,您將首先抵達牆壁
\ n對您的意見完全沒有任何影響
\ n那是什麼?
\ n那是什麼?
\ n
\ n暗箱讓你看起來很難看
\ n踢腿和尖叫古奇小豬小豬
\ n你不記得
\ n你不記得
\ n爲什麼你不記得我的名字?
\ n關閉他的頭,男人
\ n關閉他的頭,男人
\ n爲什麼你不記得我的名字?
\ n我想他是
\ n
\ n降下來,降下來
\ n在我身上下着雨
\ n從很高的高度
\ n從很高的高度,高度
\ n降下來,降下來
\ n下雨在我身上
\ n從一個很高的高度
\ n從一個很高的高度,高度,
\ n降下來,降下來
\ n下降在我身上
\ n
\ n就是這樣,先生
\ n您要離開
\ n豬皮裂紋
\ n灰塵和尖叫
\ n雅皮士聯網
\ n恐慌,嘔吐
\ n恐慌,嘔吐
\ n上帝愛他的孩子,
\ n上帝愛他的孩子,是啊!

\ n編輯歌詞\ n編輯維基\ n添加視頻\ n
]

+0

請提供您的追蹤 – Signal

+0

不知道你想要做什麼,但在正則表達式獲取URL,這部分'[^圖片]'是一個字符類,而不是一個短語。如果您將其更改爲「(?!image)」,則會成爲一個短語。除此之外,通過提取_text_是什麼意思?你的意思是那些'\ n'是文字,還是隻是調試換行符控制代碼的文本表示? – sln

+0

[^ image]我想要的行不包含這樣的行:songmeanings.com/image/PATH/TO/AN/IMAGE。PNG 和我的意思是提取純文本的一些功能,將HTML文件轉換爲純文本,當然我知道我可以用sed和awk做到這一點,但我真的很喜歡在我的Python程序中使用,而不使用正則表達式 – kato

回答

0

追加下面的代碼行:

lyric = ''.join([tag.text for tag in lyric]) 

lyric = Soup.findAll(attrs={"lyric-box"}) 

你會得到輸出類似

     Please could you stop the noise, 
I'm trying to get some rest 
From all the unborn chicken voices in my head 
What's that? 
What's that? 

When I am king, you will be first against the wall 
With your opinion which is of no consequence at all 
What's that? 
What's that? 

... 
0

首先修剪所述前緣和通過執行stringvar[1:-1]然後在每行呼叫linevar.strip()這將剝離所有的空格尾隨[]。

0

的傢伙誰之類的想法,有一些小的變化最後我的代碼看起來像這樣:)

import re 
 
import pycurl 
 
import bs4 
 
from urllib import unquote 
 
from StringIO import StringIO 
 

 

 
def getLink(fileName): 
 
    fileName = unquote(fileName) 
 
    baseAddres = "https://songmeanings.com/query/?query=" 
 
    linkToPage = str(baseAddres)+str(fileName)+str("&type=songtitles") 
 
    
 
    buffer = StringIO() 
 
    page = pycurl.Curl() 
 
    page.setopt(page.URL,linkToPage) 
 
    page.setopt(page.WRITEDATA,buffer) 
 
    page.perform() 
 
    page.close() 
 
    
 
    pageSTR = buffer.getvalue() 
 
    
 
    soup = bs4.BeautifulSoup(pageSTR,"lxml") 
 
    
 
    tab_content = str(soup.find_all(attrs={"tab-content"}))  
 
    pattern = r'\"\/\/songmeanings.com\/.+?\"' 
 
    links = re.findall(pattern,tab_content) 
 
    
 
    """returns first mached item without double quote 
 
    at the beginning and at the end of the string""" 
 
    return("http:"+links[0][1:-1:]) 
 

 
    
 
def getText(linkToSong): 
 
    
 
    buffer = StringIO() 
 
    page = pycurl.Curl() 
 
    page.setopt(page.URL,linkToSong) 
 
    page.setopt(page.WRITEDATA,buffer) 
 
    page.perform() 
 
    page.close() 
 
    
 
    pageSTR = buffer.getvalue() 
 
    
 
    soup = bs4.BeautifulSoup(pageSTR,"lxml") 
 
    
 
    lyric_box = soup.find_all(attrs={"lyric-box"}) 
 
    lyric_boxSTR = ''.join([tag.text for tag in lyric_box]) 
 
    return(lyric_boxSTR) 
 
    
 
    
 
link = getLink("Anarchy In The U.K") 
 
text = getText(link) 
 
print(text)