【Python3 爬蟲】U11_BeautifulSoup4庫提取數據詳解



在下面的內容中引用了 前程無憂網的部分源碼進行案例演示,以下全部都是以實戰案例來對BeautifulSoup4庫提取數據進行解析。
前程無憂網部分源碼:(在下述代碼中將使用 "前程無憂"代表以下代碼)

<div class="el">
    <p class="t1 ">
        <em class="check" name="delivery_em" onclick="checkboxClick(this)"></em>
        <input class="checkbox" type="checkbox" name="delivery_jobid" value="120207510" jt="0" style="display:none" />
        <span>
            <a target="_blank" title="python教師" href="https://jobs.51job.com/kunming-whq/120207510.html?s=01&t=0"  onmousedown="">
                python教師                </a>
        </span>
                                                                </p>
    <span class="t2"><a target="_blank" title="雲南通識教育信息咨詢有限公司" href="https://jobs.51job.com/all/co5751385.html">雲南通識教育信息咨詢有限公司</a></span>
    <span class="t3">昆明-五華區</span>
    <span class="t4">4.5-6千/月</span>
    <span class="t5">03-29</span>
</div>
<div class="el">
    <p class="t1 ">
        <em class="check" name="delivery_em" onclick="checkboxClick(this)"></em>
        <input class="checkbox" type="checkbox" name="delivery_jobid" value="118417429" jt="0" style="display:none" />
        <span>
            <a target="_blank" title="Python工程師" href="https://jobs.51job.com/kunming-whq/118417429.html?s=01&t=0"  onmousedown="">
                Python工程師                </a>
        </span>
                                                                </p>
    <span class="t2"><a target="_blank" title="雲南藍典科技股份有限公司" href="https://jobs.51job.com/all/co4646964.html">雲南藍典科技股份有限公司</a></span>
    <span class="t3">昆明-五華區</span>
    <span class="t4">4-6千/月</span>
    <span class="t5">03-27</span>
</div>
<div class="el">
    <p class="t1 ">
        <em class="check" name="delivery_em" onclick="checkboxClick(this)"></em>
        <input class="checkbox" type="checkbox" name="delivery_jobid" value="120703493" jt="0" style="display:none" />
        <span>
            <a target="_blank" title="YX00-Python開發工程師" href="https://jobs.51job.com/kunming-gdq/120703493.html?s=01&t=0"  onmousedown="">
                YX00-Python開發工程師                </a>
        </span>
                                                                </p>
    <span class="t2"><a target="_blank" title="雲南遠信科技有限公司" href="https://jobs.51job.com/all/co2256249.html">雲南遠信科技有限公司</a></span>
    <span class="t3">昆明-官渡區</span>
    <span class="t4">4-8千/月</span>
    <span class="t5">03-27</span>
</div>
<div class="el">
    <p class="t1 ">
        <em class="check" name="delivery_em" onclick="checkboxClick(this)"></em>
        <input class="checkbox" type="checkbox" name="delivery_jobid" value="117230454" jt="0" style="display:none" />
        <span>
            <a target="_blank" title="Python開發工程師" href="https://jobs.51job.com/kunming/117230454.html?s=01&t=0"  onmousedown="">
                Python開發工程師                </a>
        </span>
                                                                </p>
    <span class="t2"><a target="_blank" title="雲南紫米科技有限公司" href="https://jobs.51job.com/all/co4672988.html">雲南紫米科技有限公司</a></span>
    <span class="t3">昆明</span>
    <span class="t4">0.8-1萬/月</span>
    <span class="t5">03-27</span>
</div>
<div class="el">
    <p class="t1 ">
        <em class="check" name="delivery_em" onclick="checkboxClick(this)"></em>
        <input class="checkbox" type="checkbox" name="delivery_jobid" value="117148016" jt="0" style="display:none" />
        <span>
            <a target="_blank" title="Python高級開發工程師" href="https://jobs.51job.com/kunming-plq/117148016.html?s=01&t=0"  onmousedown="">
                Python高級開發工程師                </a>
        </span>
                                                                </p>
    <span class="t2"><a target="_blank" title="微加普惠金融服務(深圳)有限公司" href="https://jobs.51job.com/all/co5633133.html">微加普惠金融服務(深圳)有限公司...</a></span>
    <span class="t3">昆明-盤龍區</span>
    <span class="t4">1-2萬/月</span>
    <span class="t5">03-27</span>
</div>
<div class="el">
    <p class="t1 ">
        <em class="check" name="delivery_em" onclick="checkboxClick(this)"></em>
        <input class="checkbox" type="checkbox" name="delivery_jobid" value="118740280" jt="0" style="display:none" />
        <span>
            <a target="_blank" title="Java/大數據/python 講師" href="https://jobs.51job.com/kunming/118740280.html?s=01&t=0"  onmousedown="">
                Java/大數據/python 講師                </a>
        </span>
                                                                </p>
    <span class="t2"><a target="_blank" title="雲南新華計算機中等專業學校" href="https://jobs.51job.com/all/co3757091.html">雲南新華計算機中等專業學校</a></span>
    <span class="t3">昆明</span>
    <span class="t4">0.5-1萬/月</span>
    <span class="t5">03-27</span>
</div>
<div class="el">
    <p class="t1 ">
        <em class="check" name="delivery_em" onclick="checkboxClick(this)"></em>
        <input class="checkbox" type="checkbox" name="delivery_jobid" value="104297888" jt="0" style="display:none" />
        <span>
            <a target="_blank" title="Python開發工程師" href="https://jobs.51job.com/kunming-whq/104297888.html?s=01&t=0"  onmousedown="">
                Python開發工程師                </a>
        </span>
                                                                </p>
    <span class="t2"><a target="_blank" title="雲南創至互達網絡科技有限公司" href="https://jobs.51job.com/all/co4670824.html">雲南創至互達網絡科技有限公司</a></span>
    <span class="t3">昆明-五華區</span>
    <span class="t4">0.6-1萬/月</span>
    <span class="t5">03-19</span>
</div>
<div class="el">
    <p class="t1 ">
        <em class="check" name="delivery_em" onclick="checkboxClick(this)"></em>
        <input class="checkbox" type="checkbox" name="delivery_jobid" value="120456484" jt="0" style="display:none" />
        <span>
            <a target="_blank" title="Python開發工程師" href="https://jobs.51job.com/kunming/120456484.html?s=01&t=0"  onmousedown="">
                Python開發工程師                </a>
        </span>
                                                                </p>
    <span class="t2"><a target="_blank" title="雲思華盛(北京)科技有限公司" href="https://jobs.51job.com/all/co2898169.html">雲思華盛(北京)科技有限公司</a></span>
    <span class="t3">昆明</span>
    <span class="t4">10-15萬/年</span>
    <span class="t5">03-14</span>
</div>

1.獲取所有的p標簽

html = "前程無憂"
soup = BeautifulSoup(html,'lxml')
ps = soup.find_all('p')
for p in ps:
    print(p)
    print("=" * 40)

上述代碼中輸出的p是一個tag類型,但是from bs4.element import Tag,進入到Tag這個類下,我們可以找到以下方法:__repr__,從下圖可以看到,該方法能將元素以字符串形式打印出來。

輸出結果如下圖:

2.獲取第2個p標簽

html = "前程無憂"
soup = BeautifulSoup(html,'lxml')
p = soup.find_all('p',limit=2)[1] # limit=2:最多提取2個標簽
print(p)

輸出結果如下圖:

3.獲取所有class等於t3的span標簽

html = "前程無憂"
soup = BeautifulSoup(html,'lxml')
spans = soup.find_all('span',class_='t3') # 此處使用class_,由於class是關鍵字
# 上述語句也可以使用attrs替換:spans = soup.find_all('span',attrs=({'class':"t3"}))
for span in spans:
    print(span)
    print("=" * 40)

4.獲取class等於check,name等於delivery_em的em標簽

html = "前程無憂"
soup = BeautifulSoup(html,'lxml')
# 錯誤的語法:emList = soup.find_all('em', class_="check" ,name="delivery_em" )
emList = soup.find_all('em', attrs = {'class':"check" ,'name':"delivery_em"} )
for em in emList:
    print(em)
    print("=" * 40)

此處如果使用emList = soup.find_all('em', class_="check" ,name="delivery_em" ),則會報錯如下圖,是由於:findall()中不能直接使用name作為參數

5.獲取class為t1的p標簽下的所有a標簽的href屬性

html = "前程無憂"
soup = BeautifulSoup(html,'lxml')
pList = soup.find_all('p',class_='t1')
for p in pList:
    aList = p.find_all('a')
    for a in aList:
        # 1)通過下標操作(推薦使用,語法簡潔明了)
        href = a['href']
        print(href)
        print("=" * 40)

        # 2)通過attrs屬性
        # href = a.attrs['href']
        # print(href)
        # print("=" * 40)

輸出結果:

6.獲取所有的職位信息(文本)

html = "前程無憂"
soup = BeautifulSoup(html,'lxml')
divs = soup.find_all('div')[1:]
infoSet = list()
for div in divs:
    info = {}
    infos = list(div.stripped_strings) # div.stripped_strings返回的是一個生成器
    info['job'] = infos[0]
    info['company'] = infos[1]
    info['address'] = infos[2]
    info['salary'] = infos[3]
    info['ReleaseDate'] = infos[4]
    infoSet.append(info)
print(infoSet)

輸出結果:

7.總結

7.1 find_all的使用

  • 1.在提取標簽的時候,第一個是標簽的名字。如果在提取標簽的時候想要使用標簽屬性進行過濾,那么可以在方法中通過關鍵字參數的形式,將屬性的名字及對應的值傳進去,或者使用attrs屬性,將所有的屬性以及對應的值放在一個字典中傳給attrs
  • 2.limit屬性可以限制提取標簽的數量

7.2 find與find_all的區別

  • find:找到第一個滿足條件的標簽返回
  • find_all:將所有滿足條件的標簽都返回

7.3 find與find_all的過濾條件

  • 關鍵字參數:將屬性的名字作為關鍵字的參數,以及屬性的值作為關鍵字的值進行過濾,如:soup.find_all('p',class_='t1')
  • attrs參數:將屬性條件放到一個字典中,傳給attrs參數。如:soup.find_all('p',attrs={'class':'t1'})

7.4 獲取標簽的屬性

  • 通過下標獲取
href = a['href']
  • 通過attrs屬性獲取
href = a.attrs['href']

7.5 strings和stripped_strings、string屬性以及get_text方法

  • string:獲取某個標簽下的非標簽字符串,返回的是個字符串。
  • strings:獲取某個標簽下的子孫非標簽字符串,返回的是個生成器。
  • stripped_strings:獲取某個標簽下的子孫非標簽字符串,會去掉空白字符,返回的是個生成器。
  • get_text:獲取某個標簽下的子孫非標簽字符串,不是以生成器的形式返回。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM