BeautifulSoup .text 方法返回不带分隔符的文本(\n、\r 等)

Posted

技术标签:

【中文标题】BeautifulSoup .text 方法返回不带分隔符的文本(\\n、\\r 等)【英文标题】:BeautifulSoup .text method returns text without separators (\n, \r etc)BeautifulSoup .text 方法返回不带分隔符的文本(\n、\r 等) 【发布时间】:2012-08-20 21:23:02 【问题描述】:

我尝试从最大的俄罗斯歌词网站 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方法返回字符串没有任何分隔符:

“昨天,我所有的烦恼似乎都那么遥远,现在看来,它们都在这里停留了哦,我相信昨天突然间,我不再是从前的一半了,我的阴影笼罩着我哦,昨天突然来了[合唱:]她为什么要走我不知道,她不会说我说错了,现在我渴望昨天昨天,爱是那么容易玩的游戏现在我需要一个躲藏的地方哦,我相信”

这是主要问题。接下来,有什么更好的方式来保存歌词:

歌词第 1 行(原创)

歌词第一行(翻译)

歌词第 2 行(原创)

歌词第 2 行(翻译)

歌词第 3 行(原创)

歌词第 3 行(翻译)

...

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

【问题讨论】:

请提供您正在解析的实际页面的链接。 示例:amalgama.mobi/songs/b/beatles/yesterday.html 请注意,歌曲文本中没有 换行符,只有 &lt;br/&gt; 标签,OP 正在剥离这些标签。 我知道:) 有什么更好的方法来转换 html > 文本? OFC,我可以用'\n'替换,并自己删除所有其他标签,但它看起来..dirtly 【参考方案1】:

试试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. '

【讨论】:

谢谢,它成功了。我用它来获取网页的文本,然后我使用re.sub(r"(\n( ?))+", "\n", my_text) 删除多个回车,re.sub(r" +", " ", my_text) 删除多个空格。【参考方案2】:

我建议您查看 BeautifulSoup 4 中的 .strings generator。

【讨论】:

另外,您可以关注stripped_strings。如果你想迭代生成器,你可以试试这个for string in soup.stripped_strings:【参考方案3】:

你可以这样做:

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)

【讨论】:

以上是关于BeautifulSoup .text 方法返回不带分隔符的文本(\n、\r 等)的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup库findAll()find()方法详解

python学习——Beautifulsoup 模块

03_BeautifulSoup的使用2-搜索文档树

python beautifulsoup 怎么得到option的值

Beautifulsoup find_all 返回一个空列表

爬虫初体验:Python+Requests+BeautifulSoup抓取广播剧