python-68:BS4獲取多個標籤的文本

上一小節咱們講解了如何獲取源碼並提取文章的標題,咱們使用的是soup.title.string ,通過對網頁源碼的分析,我發現文章的內容大部分都在<p>...</p>標籤裏,就像這樣,因此我如今想將全部<p>的內容獲取出來看看是什麼結果html

<p>若是你用的是新版的Debain或ubuntu,那麼能夠經過系統的軟件包管理來安裝:</p>
<p><code class="docutils literal"><span class="pre">$</span> <span class="pre">apt-get</span> <span class="pre">install</span> <span class="pre">Python-bs4</span></code></p>
<p>Beautiful Soup 4 經過PyPi發佈,因此若是你沒法使用系統包管理安裝,那麼也能夠經過 <code class="docutils literal"><span class="pre">easy_install</span></code> 或 <code class="docutils literal"><span class="pre">pip</span></code> 來安裝.包的名字是 <code class="docutils literal"><span class="pre">beautifulsoup4</span></code> ,這個包兼容Python2和Python3.</p>
<p><code class="docutils literal"><span class="pre">$</span> <span class="pre">easy_install</span> <span class="pre">beautifulsoup4</span></code></p>
<p><code class="docutils literal"><span class="pre">$</span> <span class="pre">pip</span> <span class="pre">install</span> <span class="pre">beautifulsoup4</span></code></p>
<p>(在PyPi中還有一個名字是 <code class="docutils literal"><span class="pre">BeautifulSoup</span></code> 的包,但那可能不是你想要的,那是 <a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html">Beautiful Soup3</a> 的發佈版本,由於不少項目還在使用BS3, 因此 <code class="docutils literal"><span class="pre">BeautifulSoup</span></code> 包依然有效.可是若是你在編寫新項目,那麼你應該安裝的 <code class="docutils literal"><span class="pre">beautifulsoup4</span></code> )</p>
<p>若是你沒有安裝 <code class="docutils literal"><span class="pre">easy_install</span></code> 或 <code class="docutils literal"><span class="pre">pip</span></code> ,那你也能夠 <a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/download/4.x/">下載BS4的源碼</a> ,而後經過setup.py來安裝.</p>
<p><code class="docutils literal"><span class="pre">$</span> <span class="pre">Python</span> <span class="pre">setup.py</span> <span class="pre">install</span></code></p>
<p>若是上述安裝方法都行不通,Beautiful Soup的發佈協議容許你將BS4的代碼打包在你的項目中,這樣無須安裝便可使用.</p>
<p>做者在Python2.7和Python3.2的版本下開發Beautiful Soup, 理論上Beautiful Soup應該在全部當前的Python版本中正常工做</p>

依照前面的方法,我想這裏應該這樣寫
python

print soup.p.string

可是結果是這樣的:ubuntu

這個結果很令我吃驚,因而我又將代碼修改爲只輸出<p>標籤的結果,而後變成了這樣的:spa

print soup.p


無論怎麼看,這結果都像是隻返回了一個<p>標籤的內容,這令我大惑不解,到底是爲何?code

咱們一個問題一個問題的來解決,首先是 soup.p 爲何只返回一個標籤orm

經過點取屬性的方式只能得到當前名字的第一個tag:
soup.a
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>htm

若是想要獲得全部的<a>標籤,或是經過名字獲得比一個tag更多的內容的時候,就須要用到 Searching the tree 中描述的方法,好比: find_all()
soup.find_all('a')
ip

既然這樣,那咱們的代碼應該修改一下:
開發

print soup.find_all('p')

結果是這樣的:get

這裏的符號顯示返回的應該是一個列表,但這具體是怎麼回事如今先無論,咱們再來看看第二個問題:爲何使用soup.p.string 的時候結果是None?

若是tag只有一個 NavigableString 類型子節點,那麼這個tag能夠使用 .string 獲得子節點:
title_tag.string
# u'The Dormouse's story'

若是一個tag僅有一個子節點,那麼這個tag也能夠使用 .string 方法,輸出結果與當前惟一子節點的 .string 結果相同:
head_tag.contents
# [<title>The Dormouse's story</title>]
head_tag.string
# u'The Dormouse's story'

若是tag包含了多個子節點,tag就沒法肯定 .string 方法應該調用哪一個子節點的內容, .string 的輸出結果是 None :
print(soup.html.string)
# None

這裏的描述已經很詳細了,我再講的話有點多餘了,因此,一句話總結:

soup.p 這樣的方式只能獲取第一個p標籤,soup.p.string 沒法獲取獲取多個標籤裏面的文本內容。

很明顯這徹底不能實現咱們須要的功能,咱們須要獲取多個標籤裏面的文字,因此咱們須要尋找新的方法,好在前面已經給了提示,find_all() , 那好,咱們就來看看它究竟是什麼吧

相關文章
相關標籤/搜索