BeautifulSoup Python添加额外的字符

时间:2014-10-30 09:08:03

标签: python html python-3.x beautifulsoup

我目前正在尝试编写一个脚本,其中包含一个url到lyricswikia并从网站上删除歌词。我想我已经弄清楚如何隔离相关的div标签,但由于某种原因python在div标签前输出了一个“b”,我不知道如何从脚本之间提取歌词在div标签内。我的代码如下:

from bs4 import BeautifulSoup
import requests

#gets webpage
r = requests.get('http://lyrics.wikia.com/2Pac:Dear_Mama')
string = r.content
soup = BeautifulSoup(string[3:])

results = soup.find('div', {'class': 'lyricbox'}).encode('utf-8')
print(results)

编辑:我的最终目标仍然是打印网页上的歌词和歌词,作为字符串,所以我需要将字节文字对象转换为字符串,并以某种方式删除最后的注释。我尝试从下面的Vincent建议代码中删除.encode('utf-8'),它可以正常工作但是在结尾处的注释开始时会发出错误。

2 个答案:

答案 0 :(得分:1)

b,跟随https://docs.python.org/2/reference/lexical_analysis.html#string-literals

  

' b'的前缀或者' B'在Python 2中被忽略;它表明了   literal应该成为Python 3中的字节文字(例如,当代码是   自动转换为2to3)。 A' u'或者' b'前缀可能是   接着是一个' r'前缀。

或者对于python 3 https://docs.python.org/3.3/reference/lexical_analysis.html#string-literals

  

字节文字总是以' b'为前缀。或者' B&#39 ;;他们生产了一个   字节类型的实例而不是str类型。他们可能只是   包含ASCII字符;数字值为128或更大的字节   必须用逃避来表达。

使用Python2或Python3,这将打印整个lyrik。

from __future__ import print_function
from bs4 import BeautifulSoup
import requests

#gets webpage
r = requests.get('http://lyrics.wikia.com/2Pac:Dear_Mama')
soup = BeautifulSoup(r.text)

for child in soup.select('div.lyricbox')[0].children:
    if child.name == None:
        print(child.encode('utf-8'))

注意:最后还有一些评论。

答案 1 :(得分:0)

如果你只需要抒情文本,我会建议使用pyquery而不是BeautifulSoup,因为我觉得前者在很多情况下都比较简单。 (有些情况下BS很擅长,但这不一定是其中之一。)

import requests
from pyquery import PyQuery as pq

r = requests.get('http://lyrics.wikia.com/2Pac:Dear_Mama')

# You could also use r.content but it does not affect the result
doc = pq(r.text)

# Remove the script element; the HTML comment is ignored using .text()
print(doc('div.lyricbox').remove('script').text())

更新:我刚刚注意到这是标记为Python3的,此时我没有用它进行测试的盒子,但我认为它应该按原样运行(我在最后一行更改了print())