最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python網(wǎng)頁(yè)解析利器BeautifulSoup安裝使用介紹

 更新時(shí)間:2015年03月17日 09:14:28   投稿:junjie  
這篇文章主要介紹了Python網(wǎng)頁(yè)解析利器BeautifulSoup安裝使用介紹,本文用一個(gè)完整示例一步一步安裝了BeautifulSoup的安裝和使用過程,需要的朋友可以參考下

python解析網(wǎng)頁(yè),無出BeautifulSoup左右,此是序言

安裝

BeautifulSoup4以后的安裝需要用eazy_install,如果不需要最新的功能,安裝版本3就夠了,千萬(wàn)別以為老版本就怎么怎么不好,想當(dāng)初也是千萬(wàn)人在用的啊。安裝很簡(jiǎn)單

復(fù)制代碼 代碼如下:

然后把里面的BeautifulSoup.py這個(gè)文件放到你python安裝目錄下的site-packages目錄下

site-packages是存放Python第三方包的地方,至于這個(gè)目錄在什么地方呢,每個(gè)系統(tǒng)不一樣,可以用下面的方式找一下,基本上都能找到

復(fù)制代碼 代碼如下:

$ sudo find / -name "site-packages" -maxdepth 5 -type d 
$ find ~ -name "site-packages" -maxdepth 5 

當(dāng)然如果沒有root權(quán)限就查找當(dāng)前用戶的根目錄
復(fù)制代碼 代碼如下:

$ find ~ -name "site-packages" -maxdepth 5 -type d 

如果你用的是Mac,哈哈,你有福了,我可以直接告訴你,Mac的這個(gè)目錄在/Library/Python/下,這個(gè)下面可能會(huì)有多個(gè)版本的目錄,沒關(guān)系,放在最新的一個(gè)版本下的site-packages就行了。使用之前先import一下
復(fù)制代碼 代碼如下:

from BeautifulSoup import BeautifulSoup 

使用

在使用之前我們先來看一個(gè)實(shí)例
現(xiàn)在給你這樣一個(gè)頁(yè)面

復(fù)制代碼 代碼如下:

它是豆瓣電影分類下的喜劇電影,如果讓你找出里面評(píng)分最高的100部,該怎么做呢
好了,我先曬一下我做的,鑒于本人在CSS方面處于小白階段以及天生沒有美術(shù)細(xì)菌,界面做的也就將就能看下,別吐

接下來我們開始學(xué)習(xí)BeautifulSoup的一些基本方法,做出上面那個(gè)頁(yè)面就易如反掌了

鑒于豆瓣那個(gè)頁(yè)面比較復(fù)雜,我們先以一個(gè)簡(jiǎn)單樣例來舉例,假設(shè)我們處理如下的網(wǎng)頁(yè)代碼

復(fù)制代碼 代碼如下:

<html> 
<head><title>Page title</title></head> 
<body> 
    <p id="firstpara" align="center"> 
    This is paragraph 
        <b> 
        one 
        </b> 
        . 
    </p> 
    <p id="secondpara" align="blah"> 
    This is paragraph 
        <b> 
        two 
        </b> 
        . 
    </p> 
</body> 
</html> 

你沒看錯(cuò),這就是官方文檔里的一個(gè)樣例,如果你有耐心,看官方文檔就足夠了,后面的你都不用看
http://www.leeon.me/upload/other/beautifulsoup-documentation-zh.html

初始化

首先將上面的HTML代碼賦給一個(gè)變量html如下,為了方便大家復(fù)制這里貼的是不帶回車的,上面帶回車的代碼可以讓大家看清楚HTML結(jié)構(gòu)

復(fù)制代碼 代碼如下:

html = '<html><head><title>Page title</title></head><body><p id="firstpara" align="center">This is paragraph<b>one</b>.</p><p id="secondpara" align="blah">This is paragraph<b>two</b>.</p></body></html>' 

初始化如下:
復(fù)制代碼 代碼如下:

soup = BeautifulSoup(html) 

我們知道HTML代碼可以看成一棵樹,這個(gè)操作等于是把HTML代碼解析成一種樹型的數(shù)據(jù)結(jié)構(gòu)并存儲(chǔ)在soup中,注意這個(gè)數(shù)據(jù)結(jié)構(gòu)的根節(jié)點(diǎn)不是<html>,而是soup,其中html標(biāo)簽是soup的唯一子節(jié)點(diǎn),不信你試試下面的操作
復(fù)制代碼 代碼如下:

print soup 
print soup.contents[0] 
print soup.contents[1] 

前兩個(gè)輸出結(jié)果是一致的,就是整個(gè)html文檔,第三條輸出報(bào)錯(cuò)IndexError: list index out of range

查找節(jié)點(diǎn)

查找節(jié)點(diǎn)有兩種反回形式,一種是返回單個(gè)節(jié)點(diǎn),一種是返回節(jié)點(diǎn)list,對(duì)應(yīng)的查找函數(shù)分別為find和findAll

單個(gè)節(jié)點(diǎn)

1.根據(jù)節(jié)點(diǎn)名

復(fù)制代碼 代碼如下:

## 查找head節(jié)點(diǎn) 
print soup.find('head') ## 輸出為<head><title>Page title</title></head> 
## or 
## head = soup.head 

這種方式查找到的是待查找節(jié)點(diǎn)最近的節(jié)點(diǎn),比如這里待查找節(jié)點(diǎn)是soup,這里找到的是離soup最近的一個(gè)head(如果有多個(gè)的話)

2.根據(jù)屬性

復(fù)制代碼 代碼如下:

## 查找id屬性為firstpara的節(jié)點(diǎn) 
print soup.find(attrs={'id':'firstpara'})   
## 輸出為<p id="firstpara" align="center">This is paragraph<b>one</b>.</p> 
## 也可節(jié)點(diǎn)名和屬性進(jìn)行組合 
print soup.find('p', attrs={'id':'firstpara'})  ## 輸出同上

3.根據(jù)節(jié)點(diǎn)關(guān)系

節(jié)點(diǎn)關(guān)系無非就是兄弟節(jié)點(diǎn),父子節(jié)點(diǎn)這樣的

復(fù)制代碼 代碼如下:

p1 = soup.find(attrs={'id':'firstpara'}) ## 得到第一個(gè)p節(jié)點(diǎn) 
print p1.nextSibling ## 下一個(gè)兄弟節(jié)點(diǎn) 
## 輸出<p id="secondpara" align="blah">This is paragraph<b>two</b>.</p> 
p2 = soup.find(attrs={'id':'secondpara'}) ## 得到第二個(gè)p節(jié)點(diǎn) 
print p2.previousSibling ## 上一個(gè)兄弟節(jié)點(diǎn) 
## 輸出<p id="firstpara" align="center">This is paragraph<b>one</b>.</p> 
print p2.parent ## 父節(jié)點(diǎn),輸出太長(zhǎng)這里省略部分 <body>...</body> 
print p2.contents[0] ## 第一個(gè)子節(jié)點(diǎn),輸出u'This is paragraph'

多個(gè)節(jié)點(diǎn)

將上面介紹的find改為findAll即可返回查找到的節(jié)點(diǎn)列表,所需參數(shù)都是一致的

1.根據(jù)節(jié)點(diǎn)名

復(fù)制代碼 代碼如下:

## 查找所有p節(jié)點(diǎn) 
soup.findAll('p')

2.根據(jù)屬性查找
復(fù)制代碼 代碼如下:

## 查找id=firstpara的所有節(jié)點(diǎn) 
soup.findAll(attrs={'id':'firstpara'}) 

需要注意的是,雖然在這個(gè)例子中只找到一個(gè)節(jié)點(diǎn),但返回的仍是一個(gè)列表對(duì)象

上面的這些基本查找功能已經(jīng)可以應(yīng)付大多數(shù)情況,如果需要各個(gè)高級(jí)的查找,比如正則式,可以去看官方文檔

獲取文本

getText方法可以獲取節(jié)點(diǎn)下的所有文本,其中可以傳遞一個(gè)字符參數(shù),用來分割每個(gè)各節(jié)點(diǎn)之間的文本

復(fù)制代碼 代碼如下:

## 獲取head節(jié)點(diǎn)下的文本 
soup.head.getText()         ## u'Page title' 
## or 
soup.head.text 
## 獲取body下的所有文本并以\n分割 
soup.body.getText('\n')     ## u'This is paragraph\none\n.\nThis is paragraph\ntwo\n.' 

實(shí)戰(zhàn)

有了這些功能,文章開頭給出的那個(gè)Demo就好做了,我們?cè)賮砘仡櫹露拱甑倪@個(gè)頁(yè)面
http://movie.douban.com/tag/%E5%96%9C%E5%89%A7
如果要得到評(píng)分前100的所有電影,對(duì)這個(gè)頁(yè)面需要提取兩個(gè)信息:1、翻頁(yè)鏈接;2、每部電影的信息(外鏈,圖片,評(píng)分、簡(jiǎn)介、標(biāo)題等)
當(dāng)我們提取到所有電影的信息后再按評(píng)分進(jìn)行排序,選出最高的即可,這里貼出翻頁(yè)提取和電影信息提取的代碼

復(fù)制代碼 代碼如下:

## filename: Grab.py 
from BeautifulSoup import BeautifulSoup, Tag 
import urllib2 
import re 
from Log import LOG 
 
def LOG(*argv): 
    sys.stderr.write(*argv) 
    sys.stderr.write('\n') 
 
class Grab(): 
    url = '' 
    soup = None 
    def GetPage(self, url): 
        if url.find('http://',0,7) != 0: 
            url = 'http://' + url 
        self.url = url 
        LOG('input url is: %s' % self.url) 
        req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"}) 
        try: 
            page = urllib2.urlopen(req) 
        except: 
            return 
        return page.read()   
 
    def ExtractInfo(self,buf): 
        if not self.soup: 
            try: 
                self.soup = BeautifulSoup(buf) 
            except: 
                LOG('soup failed in ExtractInfo :%s' % self.url) 
            return 
        try: 
            items = self.soup.findAll(attrs={'class':'item'}) 
        except: 
            LOG('failed on find items:%s' % self.url) 
            return 
        links = [] 
        objs = []  
        titles = [] 
        scores = [] 
        comments = [] 
        intros = [] 
        for item in items: 
            try: 
                pic = item.find(attrs={'class':'nbg'}) 
                link = pic['href'] 
                obj = pic.img['src'] 
                info = item.find(attrs={'class':'pl2'}) 
                title = re.sub('[ \t]+',' ',info.a.getText().replace(' ','').replace('\n','')) 
                star = info.find(attrs={'class':'star clearfix'}) 
                score = star.find(attrs={'class':'rating_nums'}).getText().replace(' ','') 
                comment = star.find(attrs={'class':'pl'}).getText().replace(' ','') 
                intro = info.find(attrs={'class':'pl'}).getText().replace(' ','') 
            except Exception,e: 
                LOG('process error in ExtractInfo: %s' % self.url) 
                continue 
            links.append(link) 
            objs.append(obj) 
            titles.append(title)     
            scores.append(score) 
            comments.append(comment) 
            intros.append(intro) 
        return(links, objs, titles, scores, comments, intros) 
 
    def ExtractPageTurning(self,buf): 
        links = set([]) 
        if not self.soup: 
            try: 
                self.soup = BeautifulSoup(buf) 
            except: 
                LOG('soup failed in ExtractPageTurning:%s' % self.url) 
                return 
        try: 
            pageturning = self.soup.find(attrs={'class':'paginator'}) 
            a_nodes = pageturning.findAll('a') 
            for a_node in a_nodes: 
                href = a_node['href'] 
                if href.find('http://',0,7) == -1: 
                    href = self.url.split('?')[0] + href 
                links.add(href) 
        except: 
            LOG('get pageturning failed in ExtractPageTurning:%s' % self.url) 
 
        return links 
 
    def Destroy(self): 
        del self.soup 
        self.soup = None 

接著我們?cè)賮韺憘€(gè)測(cè)試樣例

復(fù)制代碼 代碼如下:

## filename: test.py 
#encoding: utf-8 
from Grab import Grab 
import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 
 
grab = Grab() 
buf = grab.GetPage('http://movie.douban.com/tag/喜劇?start=160&type=T') 
if not buf: 
        print 'GetPage failed!' 
        sys.exit() 
links, objs, titles, scores, comments, intros = grab.ExtractInfo(buf) 
for link, obj, title, score, comment, intro in zip(links, objs, titles, scores, comments, intros): 
        print link+'\t'+obj+'\t'+title+'\t'+score+'\t'+comment+'\t'+intro 
pageturning = grab.ExtractPageTurning(buf) 
for link in pageturning: 
        print link 
grab.Destroy() 

OK,完成這一步接下來的事兒就自個(gè)看著辦吧
本文只是介紹了BeautifulSoup的皮毛而已,目的是為了讓大家快速學(xué)會(huì)一些基本要領(lǐng),想當(dāng)初我要用什么功能都是去BeautifulSoup的源代碼里一個(gè)函數(shù)一個(gè)函數(shù)看然后才會(huì)的,一把辛酸淚啊,所以希望后來者能夠通過更便捷的方式去掌握一些基本功能,也不枉我一字一句敲出這篇文章,尤其是這些代碼的排版,真是傷透了腦筋

相關(guān)文章

  • 對(duì)django 模型 unique together的示例講解

    對(duì)django 模型 unique together的示例講解

    今天小編就為大家分享一篇對(duì)django 模型 unique together的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • pycharm日志總是彈出“無法運(yùn)行Git,未安裝Git”的問題

    pycharm日志總是彈出“無法運(yùn)行Git,未安裝Git”的問題

    這篇文章主要介紹了pycharm日志總是彈出“無法運(yùn)行Git,未安裝Git”的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • python實(shí)現(xiàn)圖片素描效果

    python實(shí)現(xiàn)圖片素描效果

    這篇文章主要介紹了python如何實(shí)現(xiàn)圖片素描效果,幫助大家利用python處理圖片,感興趣的朋友可以了解下
    2020-09-09
  • python opencv通過按鍵采集圖片源碼

    python opencv通過按鍵采集圖片源碼

    OpenCV是一個(gè)基于BSD許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫(kù),可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上,本文給大家分享python opencv通過按鍵采集圖片源碼,感興趣的朋友一起看看吧
    2021-05-05
  • Python中的迭代器與生成器使用及說明

    Python中的迭代器與生成器使用及說明

    這篇文章主要介紹了Python中的迭代器與生成器使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Python使用Bokeh進(jìn)行交互式數(shù)據(jù)可視化

    Python使用Bokeh進(jìn)行交互式數(shù)據(jù)可視化

    Bokeh是一個(gè)Python庫(kù),用于在Web瀏覽器中創(chuàng)建交互式數(shù)據(jù)可視化,這篇文章主要為大家學(xué)習(xí)介紹了如何使用Bokeh實(shí)現(xiàn)回執(zhí)交互式數(shù)據(jù)可視化圖表,感興趣的可以學(xué)習(xí)一下
    2023-07-07
  • 快速了解Python中的裝飾器

    快速了解Python中的裝飾器

    這篇文章主要介紹了快速了解Python中的裝飾器,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Keras函數(shù)式(functional)API的使用方式

    Keras函數(shù)式(functional)API的使用方式

    這篇文章主要介紹了Keras函數(shù)式(functional)API的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 結(jié)合OpenCV與TensorFlow進(jìn)行人臉識(shí)別的實(shí)現(xiàn)

    結(jié)合OpenCV與TensorFlow進(jìn)行人臉識(shí)別的實(shí)現(xiàn)

    這篇文章主要介紹了結(jié)合OpenCV與TensorFlow進(jìn)行人臉識(shí)別的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • python自動(dòng)化測(cè)試之破解滑動(dòng)驗(yàn)證碼

    python自動(dòng)化測(cè)試之破解滑動(dòng)驗(yàn)證碼

    這篇文章介紹了python自動(dòng)化破解之破解滑動(dòng)驗(yàn)證碼的解決方案,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07

最新評(píng)論

北安市| 开封市| 定西市| 沅陵县| 东乡县| 吴江市| 舟曲县| 毕节市| 桑植县| 屏南县| 南部县| 金山区| 香港| 奉节县| 邻水| 安徽省| 界首市| 濮阳市| 广宁县| 沈阳市| 正宁县| 丰城市| 若羌县| 合山市| 千阳县| 高唐县| 镇康县| 集安市| 郁南县| 榆中县| 裕民县| 宁国市| 孙吴县| 明光市| 杨浦区| 乌拉特中旗| 金川县| 磴口县| 鹰潭市| 桐柏县| 抚松县|