Python BeautifulSoup

        BeautifulSoup是用Python编写的第三方库,主要用于解析HTML、XML等。在用Python编写爬虫程序的时候,最直观的方法就是用正则表达式匹配想要的信息,然后逐一提取出来,但是在较为复杂的爬虫程序中,往往会发现有些信息用纯粹的正则表达式匹配很困难,或则说书写的正则表达式较为繁琐,程序常常因为正则表达式写得不够健壮而挂掉。而正是BeautifulSoup正是要解决的问题。

        对于上述的问题,用BeautifulSoup帮助编写爬虫会带来很大的帮助,一方面可以省去编写繁琐的正则表达式,另一方面,可以很大程度上避免程序由于正则表达式写得不够健壮造成的中断。网上有很多关于BeautifulSoup的教程,也可以通过官方文档获取到更详细的使用说明。在此,笔者将结合一个小爬虫和大家分享一下BeautifulSoup在实际爬虫中的运用。

        先介绍下爬虫的流程,程序首先打开百度音乐歌手页面,然后依据标签解析歌手的信息,最后把这些信息打印在控制台上。再来看看页面上的歌手,程序要做的就是把这些歌手的信息打印出来。


        再啰嗦下,关于BeautifulSoup的使用,笔者不在此作详细介绍,需要帮助的请直接查看Bs4文档

        OK,进入程序:

        想要解析页面文档,首先要获得这个页面的源代码,简单的方法可这样:

def getHtml(url):
    request = urllib2.Request(url)
    res = urllib2.urlopen(request, timeout = 6000)
    html = res.read()
    res.close()
    return html
        当然,可以把这个方法写得更详细些,具体分析下请求链接时的异常等,在此不深究。这样,就可以获取网页的源代码,接下来就是BeautifulSoup的用武之地了。

#_*_encoding:utf8_*_

'''
        使用BeautifulSoup爬取歌手信息
'''
from bs4 import BeautifulSoup
from demo.http.HttpUtil import getHtml
#HttpUtil.getHtml是一个打开url地址的方法,如上面的方法

def bs4Demo():
    html = getHtml("http://music.baidu.com/artist")
    #打开百度音乐歌手的地址
    soup = BeautifulSoup(html)
    #具体BeautifulSoup的使用请参考BeautifulSoup文档
    singerul = soup.find_all("ul", attrs={"class":"container"})
    for i in range(len(singerul)):
        singerli =  singerul[i]
        clearfix = singerli.find_all('ul',recursive=True,attrs={"class","clearfix"})
        for liItem in clearfix:
            for li in liItem.find_all("li"):
#                 tagA = li.find("a")
#                 print tagA
                if li.a:
                    name = li.a.string
#                     print name
                    url =  li.a["href"]
                    singerdetail = getHtml("http://music.baidu.com" + url)
                    detailsoup = BeautifulSoup(singerdetail)
                    singerinfo = detailsoup.find(id="baseInfo")
                    if singerinfo:
                        spanimg = singerinfo.find("span",attrs = {"class","cover"})
                        img =  spanimg.img["src"]
                        spanhot = singerinfo.find("span",attrs = {"class":"num"})
                        hot = spanhot.string
                    print name,url,hot,img
                    
                    #歌手类型
#                     path_list = detailsoup.find("ul","path-list clearfix")
#                     if path_list:
#                         singertype =  path_list.contents[3]
#                         if singertype:
#                             sort =  singertype.a.string
#                             print sort.strip()
                        
if __name__ == "__main__":
    bs4Demo()

        代码很精简,赞一下BeautifulSoup,比用正则表达式抓取这些信息简单多了吧。看看效果:



        小案例演示结束。分享,让成长的脚步从此不孤独……
 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值