我正在尝试使用BeatifulSoup抓取页面
import urllib2
from bs4 import BeautifulSoup
url='http://www.xpn.org/playlists/xpn-playlist'
page = urllib2.urlopen(url)
soup = BeautifulSoup(page.read())
for link in soup.find_all("li", class_="song"):
print link
问题是我想返回的文本没有包含在它自己的html标签
中<li class="song"> <a href="/default.htm" onclick="return clickreturnvalue()
" onmouseout="delayhidemenu()" onmouseover="dropdownmenu(this, event, menu1,
'100px','Death Vessel','Mandan Dink','Stay Close')">Buy</a>
Chuck Ragan - Rotterdam - Folkadelphia Session</li>
我想要返回的Chuck Ragan - Rotterdam - Folkadelphia Session
附加说明:返回的数据格式为Artist/Song/Album。用来存储和操作这些信息的正确数据结构是什么?
试试这样写:
for link in soup.find_all("li", class_="song"):
print link.text
输出:Buy Chuck Ragan - Rotterdam - Folkadelphia Session
当然,如果你想删除Buy
,你可以像这样使用slice
:
for link in soup.find_all("li", class_="song"):
print link.text.strip()[5:]
输出为:
Chuck Ragan - Rotterdam - Folkadelphia Session
如果您想将这些字符串保存在列表中:
[i.strip() for i in link.text.strip()[5:].split('-')]
输出:['Chuck Ragan', 'Rotterdam', 'Folkadelphia Session']
更多信息,请查看文档
这是另一种方法!(假设li
有3个孩子。如果没有,将[2]
更改为[1]
):
>>> html = '''<li class="song"> <a href="/default.htm" onclick="return clickreturnvalue()
... " onmouseout="delayhidemenu()" onmouseover="dropdownmenu(this, event, menu1,
... '100px','Death Vessel','Mandan Dink','Stay Close')">Buy</a>
... Chuck Ragan - Rotterdam - Folkadelphia Session</li>'''
>>> from bs4 import BeautifulSoup as bs
>>> all_li = soup.findAll('li', class_='song')
>>> for li in all_li:
... text = list(li.children)[2]
... artist, song, album = text.split('-')
... print artist, song, album
Chuck Ragan Rotterdam Folkadelphia Session
你可以这样写。
for l in soup.find_all("li", class_="song"):
album = l.text.split("-")[2]
song = l.text.split("-")[1]
artist = l.text.split("-")[0].split(" ")[1]
**最终使用named tuple
存储**
from bs4 import BeautifulSoup
import urllib2
from collections import namedtuple
url='http://www.xpn.org/playlists/xpn-playlist'
page = urllib2.urlopen(url)
soup = BeautifulSoup(page.read())
songs=[]
Song = namedtuple("Song", "artist name album")
for link in soup.find_all("li", class_="song"):
song = Song._make(link.text.strip()[12:].split(" - "))
songs.append(song)
for song in songs:
print(song.artist, song.name, song.album)