上一小節咱們學習了find 和 find_all 函數,咱們也知道find_all 函數返回的結果是一個列表,然而咱們並不想要列表,列表不利於咱們查看,因此咱們只能使用find,find會將匹配的結果直接返回,那麼find()函數有這麼多參數,name,keyword,attrs,text,recursive,咱們須要使用哪一個參數呢?html
咱們來看看網頁源碼python
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <div class="section" id="beautiful-soup-4-2-0"> <h1>Beautiful Soup 4.2.0 文檔<a class="headerlink" href="#beautiful-soup-4-2-0" title="永久連接至標題">¶</a></h1> <img alt="http://www.crummy.com/software/BeautifulSoup/bs4/doc/_images/6.1.jpg" class="align-right" src="http://www.crummy.com/software/BeautifulSoup/bs4/doc/_images/6.1.jpg" /> <p><a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/">Beautiful Soup</a> 是一個能夠從HTML或XML文件中提取數據的Python庫.它可以經過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式.Beautiful Soup會幫你節省數小時甚至數天的工做時間.</p> <p>這篇文檔介紹了BeautifulSoup4中全部主要特性,並切有小例子.讓我來向你展現它適合作什麼,如何工做,怎樣使用,如何達到你想要的效果,和處理異常狀況.</p> <p>文檔中出現的例子在Python2.7和Python3.2中的執行結果相同</p> <p>你可能在尋找 <a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html">Beautiful Soup3</a> 的文檔,Beautiful Soup 3 目前已經中止開發,咱們推薦在如今的項目中使用Beautiful Soup 4, <a class="reference external" href="http://www.baidu.com">移植到BS4</a></p> <div class="section" id="id1"> <h2>尋求幫助<a class="headerlink" href="#id1" title="永久連接至標題">¶</a></h2> <p>若是你有關於BeautifulSoup的問題,能夠發送郵件到 <a class="reference external" href="https://groups.google.com/forum/?fromgroups#!forum/beautifulsoup">討論組</a> .若是你的問題包含了一段須要轉換的HTML代碼,那麼確保你提的問題描述中附帶這段HTML文檔的 <a class="reference internal" href="#id60">代碼診斷</a> <a class="footnote-reference" href="#id83" id="id3">[1]</a></p> </div> </div>
這是網頁源碼中正文開始的部分,咱們看到,有<h1>標籤,這是標題,還有<p>標籤,這是段落,裏面則是文章的內容,固然,這只是其中很小很小的部分,咱們想要獲取這些內容,須要傳入find函數的哪一個參數呢?咱們來一個一個的分析,順便加深印象函數
name :name參數是針對tag進行操做的,咱們想要獲取所有的正文內容的話,就要分別對<h1>,<p>,<li>等標籤進行獲取,固然確定還會有其餘的標籤,find('h1')是獲取全部<h1>標籤的內容,其餘的也同樣,因此咱們在輸出的時候還須要對結果進行整合,這個至關麻煩,根本分不清哪一個標題對應那段文字,因此這個 pass學習
keyword:keyword聽說是能夠按tag標籤的屬性進行查找,那我這裏能夠找到整個正文內容包含在哪一個代碼塊中,多是class="xxxbody" 或者 id="xxx"等等,我可使用這個參數將整個正文所在的代碼塊摳出來,這樣章節的順序是不會變化的,這個方法好像可行,可是咱們再看看還有沒有更好的方法google
attrs:attrs是針對於匹配一些與關鍵字相同的字符串,好比import,class等等,這裏應該是用不到的url
text:啊,這個根本是想都不用想的好嘛,這個是根據text的字符串來尋找相對應的內容,咱們要傳一個字符串進去,而後find函數會尋找含有這個字符串的句子,這徹底跟咱們要實現的功能不搭調的code
recursive:這個參數設置是否遍歷某個tag的全部子孫節點,這個好像可使用,咱們只要傳入一個tag就能夠了嘛,但前提是,你的這個tag必須是惟一的,咱們如今這個網頁源碼中,正文內容的父節點的tag是<div>,但是,源碼中還有不少的<div>,咱們將這個tag傳進去的話程序並不知道咱們要尋找的是哪一個<div>裏面的子孫節點,程序運行不能達到咱們想要的效果
htm
因此沒辦法了,只能使用第二個參數了,如今的問題是,應該傳入什麼keyword開發
經過對源碼的分析,我以爲這句代碼頗有可能文檔
<div itemprop="articleBody">
這個articleBody 的英文看起來好像是文章主題的意思,並且,通常規範的程序爲了便於後面的修改和維護,它的函數名或者是關鍵字都會以相關功能的英文名字來命名,這是閱讀程序的一個小技巧,我以爲這個articleBody有可能就是咱們要的,因此將代碼整理一下,看看結果是什麼吧
#!/usr/bin/env python # -*- coding:UTF-8 -*- __author__ = '217小月月坑' ''' 獲取文章主體 ''' import urllib2 from bs4 import BeautifulSoup url = 'http://beautifulsoup.readthedocs.org/zh_CN/latest/#' request = urllib2.Request(url) response = urllib2.urlopen(request) contents = response.read() soup = BeautifulSoup(contents) # 傳入keyword參數 result = soup.find(itemprop="articleBody") print result
輸出結果
好了,結果證實正文部分的代碼已經被摳出來了,可是,咱們不能就這樣將結果直接寫入文件,咱們還要從這段源碼中獲取正文的內容,也就是那些文字什麼的,那好,咱們就來看一下應該使用什麼方法來獲取正文的內容