2014-10-30 70 views
0

我目前正在嘗試編寫一個腳本,需要URL到lyricswikia並將歌詞從網站中提取出來。我想我已經想出瞭如何隔離相關的div標籤,但由於某種原因,python在div標籤前面輸出一個「b」,我不知道如何從腳本之間提取歌詞在div標籤內。我的代碼如下:BeautifulSoup Python添加額外字符

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

你是什麼意思與__但由於某種原因python輸出它與一個「b」__如果我運行它不打印ab前面的div – 2014-10-30 09:12:45

+0

我的意思是它真正打印ab'前面的div ,如[這裏]所示(http://i.gyazo.com/56578b68e70c9d96e04a590b0bee9bdf.png) – thenorm 2014-10-30 09:22:52

+0

你正在使用二進制數據而不是字符串,所以當你打印字符串ist的表示形式將看起來像「b」。 ...「'。 – Matthias 2014-10-30 09:26:25

回答

1

在B,繼https://docs.python.org/2/reference/lexical_analysis.html#string-literals

'b' 或 'B' 的前綴在Python 2被忽略;它表明 文字應該成爲Python 3中的一個字節文字(例如當代碼是 自動轉換爲2to3時)。 'u'或'b'前綴可能是 ,後跟'r'前綴。

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

字節文字總是與 'b' 或 'B' 前綴;他們產生一個 字節類型的實例,而不是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')) 

注:最後還是有一些意見。

+0

非常有趣!我對編程非常陌生,所以整個數據結構都是令人困惑的。感謝您的幫助 – thenorm 2014-10-30 16:10:30

+0

另外,如何將最終輸出轉換爲字符串和/或擺脫字節文字指示符? – thenorm 2014-10-30 16:29:52

+0

我不太熟悉字節文字指示符。但我很確定一個對字符串的投影會有所幫助。 str([你的字符串]) – 2014-10-30 19:22:02

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())。

+0

聽起來不錯,我會試試看! – thenorm 2014-10-31 00:02:52