BeautifulSoup Python 添加额外字符
我现在正在尝试写一个脚本,这个脚本可以从lyricswikia网站上获取歌词。我觉得我已经找到了相关的div标签,但不知道为什么,Python输出的内容前面有个“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
如果你只需要歌词文本,我建议你使用 pyquery,因为我发现它在很多情况下比BeautifulSoup更简单好用。(当然,BeautifulSoup在某些情况下表现得很好,但这并不是其中之一。)
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())。
1
在Python中,前面加个'b'或'B'的意思是告诉程序,这个字符串是字节类型的。在Python 2中,这个前缀会被忽略,但在Python 3中,它会把这个字符串当作字节处理。比如,当你用工具把Python 2的代码转换成Python 3时,这个前缀就很重要。前面加个'u'或'b'的字符串也可以再加个'r'前缀。
在Python 3中,字节字符串总是要加上'b'或'B'前缀,这样它就会变成字节类型,而不是普通的字符串类型。字节字符串只能包含ASCII字符,如果有数字值在128或以上的字符,就必须用转义字符来表示。
无论是用Python 2还是Python 3,这段代码都会打印出完整的歌词。
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'))
注意:最后还有一些评论。