BeautifulSoup .text方法返回没有分隔符的文本(\ n,\ r \ n等)

时间:2012-08-25 17:31:58

标签: python parsing beautifulsoup vk

我尝试从最大的俄语歌词网站http://amalgama-lab.com解析歌词,并将歌词(已翻译和原创)保存到我的Vkontakte帐​​户的音频列表中(遗憾的是,amalgama没有任何API)

import urllib
from BeautifulSoup import BeautifulSoup
import vkontakte
vk = vkontakte.API(token=<SECRET_TOKEN>)
audios = vk.getAudios(count='2')
#{u'artist': u'The Beatles', u'url': u'http://cs4519.vkontakte.ru/u4665445/audio/4241af71a888.mp3', u'title': u'Yesterday', u'lyrics_id': u'2365986', u'duration': 130, u'aid': 166194990, u'owner_id': 173505924}
url = 'http://amalgama.mobi/songs/'
for i in audios:
    print i['artist']
    if i['artist'].startswith('The '):
        url += i['artist'][4:5] + '/' + i['artist'][4:].replace(' ', '_') + '/'     +i['title'].replace(' ', '_') + '.html'
    else:
        url += i['artist'][:1] + '/' + i['artist'].replace(' ', '_') + '/' +i['title'].replace(' ', '_') + '.html'
    url = url.lower()
    page = urllib.urlopen(url)
    soup = BeautifulSoup(page.read(), fromEncoding="utf-8")
    texts = soup.findAll('ol', )
    if len(texts) != 0:
        en = texts[0].text #this!
        ru = texts[1].text #this!
        vk.get('audio.edit', aid=i['aid'], oid = i['owner_id'], artist=i['artist'], title = i['title'], text = ru, no_search = 0)

但.text方法返回字符串,不带任何分隔符:

“昨天,我所有的烦恼都显得那么遥远现在看起来好像他们留在这里哦,我相信昨天突然,我不是以前那个男人的一半有一个阴影悬在我身上哦,昨天突然来了[合唱:]为什么她不得不去,我不知道,她不会说我说错了,现在我渴望昨天昨天,爱情是如此简单的游戏,现在我需要一个地方隐藏哦,我相信“< / p>

这是主要问题。接下来,以这种方式保存歌词的更好方法是:

歌词第1行(原创)

歌词第1行(已翻译)

歌词第2行(原创)

歌词第2行(已翻译)

歌词第3行(原创)

歌词第3行(已翻译)

...

?我只得到凌乱的代码。感谢

3 个答案:

答案 0 :(得分:14)

尝试使用get_text方法的separator参数:

from bs4 import BeautifulSoup
html = '''<p> Hi. This is a simple example.<br>Yet poweful one. <p>'''
soup = Beautifulsoup(html)
soup.get_text()  
# Output: u' Hi. This is a simple example.Yet poweful one. '
soup.get_text(separator=' ')  
# Output: u' Hi. This is a simple example. Yet poweful one. '

答案 1 :(得分:6)

答案 2 :(得分:0)

你可以这样做:

soup = BeautifulSoup(html)
ols = soup.findAll('ol') # for the two languages

for ol in ols: 
    ps = ol.findAll('p')
    for p in ps:
        for item in p.contents:
            if str(item)!='<br />':
                print str(item)