我目前正在尝试编写一个脚本,其中包含一个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'),它可以正常工作但是在结尾处的注释开始时会发出错误。
答案 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())