1. 程式人生 > >Python學習日記5|BeautifulSoup中find和find_all的用法

Python學習日記5|BeautifulSoup中find和find_all的用法

Python學習日記5|BeautifulSoup中find和find_all的用法

96 是藍先生 關注

2016.04.20 11:26* 字數 930 閱讀 37205評論 11喜歡 10

今天是4.20號。

前天晚上看到蔣方舟的一句話:

不要左顧右盼。慢慢積累,慢慢寫吧。畢竟除了這樣單調的努力,我什麼也做不了。

而現在的自己就是個十足的壁花少年。


在進入正題前先說一下每次完成程式碼後,可以用ctrl+alt+l對程式碼進行自動格式規範化。

在爬取網頁中有用的資訊時,通常是對存在於網頁中的文字或各種不同標籤的屬性值進行查詢,Beautiful Soup中內建了一些查詢方式,最常用的是find()和find_all()函式。[文獻引自

http://blog.csdn.net/abclixu123/article/details/38502993 ]。 同時通過soup.find_all()得到的所有符合條件的結果和soup.select()一樣都是列表list,而soup.find()只返回第一個符合條件的結果,所以soup.find()後面可以直接接.text或者get_text()來獲得標籤中的文字。

一、find()用法
find(name,attrs,recursive,text,**wargs)
這些引數相當於過濾器一樣可以進行篩選處理,不同的引數過濾可以應用到以下情況:
查詢標籤,基於name引數
查詢文字,基於text引數
基於正則表示式的查詢
查詢標籤的屬性,以及基於attrs引數
基於函式的查詢

<ul id="producers">  
        <li class="producerlist">  
            <div class="name">plants</div>  
            <div class="number">100000</div>  
        </li>  
        <li class="producerlist">  
            <div class="name">algae</div>  
            <div class="number">100000</div>  
        </li>  
</ul>  

以上面的例子來看:
(1)ul,li,div這些就是標籤;

用法p=soup.find('ul') ,那麼返回結果是第一個ul標籤以及<xx>...</xx>的所有內容,即上面的程式碼;注意若用p=soup.find('ul').get_text()那麼結果不是...的所有內 容,而應該是plants 10000 algae 10000,即...中的標籤不算text文字。

(2)<xx>...</xx>之間的內容就是文字;
基於文字內容的查詢也可以用soup.find(),但必須用到引數text,

用法p=soup.find(text='algae'),print(p)得到的結果就是algae

(3)正則表示式後面自己另外去學習;

(4)ul id="producers">中的id即標籤屬性,那麼我們可以查詢具有特定標籤的屬性;

用法p=soup.find('ul', id="producers"),那麼可以得到<xx>...</xx>的所有結果,其特點是把標籤更一步精確化以便於查詢。
對於大多數的情況可以用上面的方法解決,但是有兩種情況則要用到引數attrs:一是標籤字元中帶有-,比如data-custom;二是class不能看作標籤屬性。解決的辦法是在attrs屬性用字典進行傳遞引數:
soup.find(attrs={'data-custom':'xxx'})以及 soup.find(attrs={'class':'xxx'})

(5)基於函式的查詢也暫時擱置。

二、find_all()用法
應用到find()中的不同過濾引數同理可以用到find_all()中,相比find(),find_all()有個額外的引數limit,如下所示:
p=soup.find_all(text='algae',limit=2)
實際上find()也就是當limit=1時的find_all()。

關於find和find_all的用法先學習這麼多,如果後面有涉及到更深入再去研究。

到今天基本把趕集網北京地區的所有內容爬了一遍,但其中涉及到的使用代理ip時還是會報錯,等這週日聽課時來解決。馬上就要用爬取的內容進行統計分析了,所以下一篇會學習非關係型資料庫mongodb的知識。