python-63: 爲何要學習BS4

上一小節咱們提出了一個問題:爲何要學習BS4html

前面的學習中我一直使用RE,以爲也不是很難用,可是,上網查資料的時候看到大部分都使用BS4,還有不少人一直說BS4很好,雖然BS4很好,可是這還不足以讓我去學習它,總不能別人說什麼好就去作什麼事情吧,因此我決定花點心思找一找,有沒有某些狀況,使用RE無法實現或者很難實現,可是BS4卻很容易實現的呢?若是真的找到的話,這會是一個很好的學習bs4的理由
html5

咱們來看看下面一個網頁:http://www.w3school.com.cn/html5/html_5_intro.asp
python

這是一個免費的網絡教程網站,如今我須要作這樣一個嘗試,從網頁源碼中將文章的標題,正文的內容取出來,爲了便於分析,這裏仍是貼上源碼web

<div id="maincontent">
<h1>HTML 5 簡介</h1>
<div id="tpn">
<ul class="prenext">
<li class="pre"><a href="/html5/index.asp" title="HTML5 教程">HTML5 教程</a></li>
<li class="next"><a href="/html5/html_5_video.asp" title="HTML5 視頻">HTML5 視頻</a></li>
</ul>
</div>
<div id="intro">
<p><strong>HTML5 是下一代的 HTML。</strong></p>
</div>
<div>
<h2>什麼是 HTML5?</h2>
<p>HTML5 將成爲 HTML、XHTML 以及 HTML DOM 的新標準。</p>
<p>HTML 的上一個版本誕生於 1999 年。自從那之後,Web 世界已經經歷了鉅變。</p>
<p>HTML5 仍處於完善之中。然而,大部分現代瀏覽器已經具有了某些 HTML5 支持。</p>
</div>
<div>
<h2>HTML5 是如何起步的?</h2>
<p>HTML5 是 W3C 與 WHATWG 合做的結果。</p>
<p class="note"><span>編者注:</span>W3C 指 World Wide Web Consortium,萬維網聯盟。</p>
<p class="note"><span>編者注:</span>WHATWG 指 Web Hypertext Application Technology Working Group。</p>
<p>WHATWG 致力於 web 表單和應用程序,而 W3C 專一於 XHTML 2.0。在 2006 年,雙方決定進行合做,來建立一個新版本的 HTML。</p>
<p>爲 HTML5 創建的一些規則:</p>
<ul>
<li>新特性應該基於 HTML、CSS、DOM 以及 JavaScript。</li>
<li>減小對外部插件的需求(好比 Flash)</li>
<li>更優秀的錯誤處理</li>
<li>更多取代腳本的標記</li>
<li>HTML5 應該獨立於設備</li>
<li>開發進程應對公衆透明</li>
</ul>
</div>

好,咱們來分析一下怎麼從網頁中獲取咱們想要的數據,首先,大的標題是在 <h1>HTML 5 簡介</h1> 裏面,而後<h2>......</h2>是小的標題,正文的內容在<p>......</p>或者<li>......</li>裏面,第一眼看過去可能以爲這個規律這麼好找,因此re應該很好寫,但實際上真的是這樣嗎?咱們來試試看吧,按照咱們前面對源碼的分析,我首先會這樣寫,瀏覽器

<h1>(.*?)</h1>.*?<h2>(.*?)</h2>.*?<p>(.*?)</p>.*?<li>(.*?)</li>

可是這樣的輸出結果是什麼呢?網絡


明顯不是咱們想要的結果,爲何會這麼少,究竟發生了什麼事情ide

其實緣由很簡單,這樣寫的re是同時匹配這4個標籤的,它只會按照上面寫的順序去匹配內容,若是咱們網頁中全部的內容都是按下面這樣的格式寫的話,re很容易匹配學習

<h1>HTML 5 簡介</h1>
<h2>什麼是 HTML5?</h2>
<p>HTML5 將成爲 HTML、XHTML 以及 HTML DOM 的新標準。</p>
<li>新特性應該基於 HTML、CSS、DOM 以及 JavaScript。</li>

可是網頁上的源碼並非這樣的,它多是<h2>......</h2><p>......</p>或者<h2>......</h2><li>......</li>這樣各類亂入的,re就不能適應這種狀況,它並不會識別這些亂了套的標籤,由於事實上,它查找的流程是這樣的網站

  1. 你們好我是re,我要先匹配<h1>......</h1>,找到內容了,好,那就匹配下一個<h2>......</h2>
    url

  2. 可是這些<div,<ul,<li......這些是什麼鬼,我要找的不是這些,別來煩我啦,我要繼續往下找,額?又找到了,好耶

  3. 我如今須要匹配第三個<p>......</p>,可是中間仍是碰到好多<h2>,<li>的,咦?這個<h2>好像很眼熟捏?這個不是我上回找的那個嗎?可是無論了,我如今找的不是這個,我要找的是<p>,好,終於又找到了

  4. 接下來是<li>,中間仍是遇到不少的<h2>,<p>,真是的,一每天的沒事作來煩我,我要趕忙找到<li>,OK,找到了,可是這只是第一輪,我還要再找找看有沒有<h1>

  5. 貌似真的找不到<h1>的標籤了,好了,完美收工,今天就到這裏吧

若是照這樣的流程,那咱們彷佛沒有辦法可以獲取咱們想要的信息了,其實否則,方法是人想出來的嘛,咱們能夠繞點遠路,曲線救國,我這裏給你們提供兩個思路

  1. 寫四個re分別獲取<h1><h2><p><li>的數據,而後將獲取的數據整理再拼接起來

        好比可使用<h1>(.*?)</h1>,<h2>(.*?)</h2>......獲取相對應的值,而後將這些內容在輸出的時候進行拼接處理

    2.先獲取一整個代碼塊的內容,而後將不須要的部分刪掉

        咱們看到,咱們要獲取的部分是在<div id="maincontent">到<div id="bpn">之間的內容,這應該是整個網頁源碼中比較有規律的一塊,咱們可使用re將這部分的內容取出來,就像這樣

<div id="maincontent">(.*?)<div id="bpn">

  而後中間的標籤或者是各類符號什麼的咱們可使用re再進行處理,將這些內容去掉

可是這樣的方法其實也仍是很麻煩的,還有沒有別的方法呢?若是使用BS4呢?會不會好一點?

我這裏就直接上代碼了,如今能夠不用管代碼是怎麼實現的,看懂看不懂都不要緊,反正後面也會學習到的,這代碼包括查資料什麼的總共花了十幾分鍾,以前沒有任何BS4的知識,寫得很差但仍是能夠看出效果,你們隨意感覺下

#!/usr/bin/env python
# -*- coding:UTF-8 -*-
__author__ = '217小月月坑'

'''
爲何要使用bs4
'''

import urllib2
from bs4 import BeautifulSoup
# 獲取網頁內容
url = 'http://www.w3school.com.cn/html5/html_5_intro.asp'

headers = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0'}

request = urllib2.Request(url,headers=headers)
response = urllib2.urlopen(request)
contents = response.read().decode("gbk")
# bs4進行處理
soup = BeautifulSoup(contents)
result = soup.find(id="maincontent")
result_str = str(result)
soup = BeautifulSoup(result_str)
print soup.get_text()

咱們來看看結果


除去獲取網頁源碼的部分,整個BS4的處理只用了5行代碼就基本實現咱們想要的效果,這比RE要方便不少吧,固然,這只是其中的一種狀況,還有不少種狀況使用BS4比RE要方便得多,以及BS4和RE一塊兒使用的,甚至BS4中嵌入RE使用的,這些內容在後面都會盡可能講到,固然是以實例的方式來學習,畢竟看了好多無聊的文檔,己所不欲勿施於人

相關文章
相關標籤/搜索