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

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

96 是藍先生 關注正則表達式

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

今天是4.20號。數據庫

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

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

而如今的本身就是個十足的壁花少年。spa


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

在爬取網頁中有用的信息時,一般是對存在於網頁中的文本或各類不一樣標籤的屬性值進行查找,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()來得到標籤中的文本。代理

1、find()用法
find(name,attrs,recursive,text,**wargs)
這些參數至關於過濾器同樣能夠進行篩選處理,不一樣的參數過濾能夠應用到如下狀況:
查找標籤,基於name參數
查找文本,基於text參數
基於正則表達式的查找
查找標籤的屬性,以及基於attrs參數
基於函數的查找code

<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這些就是標籤;blog

用法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)基於函數的查找也暫時擱置。

2、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的知識。

相關文章
相關標籤/搜索