爬蟲3-BeautifulSoup find select findall (Python)

 

想知道BeautifulSoup 的詳細使用嗎?



快點進來吧~~~~

我們用金正恩的WIKI範例要爬取的目標是這一區塊的目錄



那他html是長這樣子(可以再Chrome按下F12打開devtool,就可以看到了)



HTML 解析:

在使用find和findAll還有select我們先把目錄區塊的HTML給攤開來

<div id="toc" class="toc" role="navigation" aria-labelledby="mw-toc-heading"><input type="checkbox" role="button"
        id="toctogglecheckbox" class="toctogglecheckbox" style="display:none">
    <div class="toctitle" lang="zh-Hant-TW" dir="ltr">
        <h2 id="mw-toc-heading">目錄</h2><span class="toctogglespan"><label class="toctogglelabel"
                for="toctogglecheckbox"></label></span>
    </div>
    <ul>
        <li class="toclevel-1 tocsection-1"><a href="#主要經歷"><span class="tocnumber">1</span> <span
                    class="toctext">主要經歷</span></a>
            <ul>
                <li class="toclevel-2 tocsection-2"><a href="#欧洲留学"><span class="tocnumber">1.1</span> <span
                            class="toctext">歐洲留學</span></a></li>
                <li class="toclevel-2 tocsection-3"><a href="#权力交接"><span class="tocnumber">1.2</span> <span
                            class="toctext">權力交接</span></a></li>
                <li class="toclevel-2 tocsection-4"><a href="#第三代领导人"><span class="tocnumber">1.3</span> <span
                            class="toctext">第三代領導人</span></a></li>
            </ul>
        </li>
        <li class="toclevel-1 tocsection-5"><a href="#政策態度"><span class="tocnumber">2</span> <span
                    class="toctext">政策態度</span></a>
            <ul>
                <li class="toclevel-2 tocsection-6"><a href="#核武和經濟並舉"><span class="tocnumber">2.1</span> <span
                            class="toctext">核武和經濟並舉</span></a></li>
                <li class="toclevel-2 tocsection-7"><a href="#外交政策的变化"><span class="tocnumber">2.2</span> <span
                            class="toctext">外交政策的變化</span></a></li>
                <li class="toclevel-2 tocsection-8"><a href="#政治清洗"><span class="tocnumber">2.3</span> <span
                            class="toctext">政治清洗</span></a></li>
                <li class="toclevel-2 tocsection-9"><a href="#人权問題"><span class="tocnumber">2.4</span> <span
                            class="toctext">人權問題</span></a></li>
            </ul>
        </li>
        <li class="toclevel-1 tocsection-10"><a href="#家庭"><span class="tocnumber">3</span> <span
                    class="toctext">家庭</span></a></li>
        <li class="toclevel-1 tocsection-11"><a href="#人物争议"><span class="tocnumber">4</span> <span
                    class="toctext">人物爭議</span></a>
            <ul>
                <li class="toclevel-2 tocsection-12"><a href="#生年争议"><span class="tocnumber">4.1</span> <span
                            class="toctext">生年爭議</span></a></li>
                <li class="toclevel-2 tocsection-13"><a href="#譯名問題"><span class="tocnumber">4.2</span> <span
                            class="toctext">譯名問題</span></a></li>
                <li class="toclevel-2 tocsection-14"><a href="#病危傳聞"><span class="tocnumber">4.3</span> <span
                            class="toctext">病危傳聞</span></a></li>
                <li class="toclevel-2 tocsection-15"><a href="#被塑造的形象"><span class="tocnumber">4.4</span> <span
                            class="toctext">被塑造的形象</span></a></li>
            </ul>
        </li>
        <li class="toclevel-1 tocsection-16">
            <a href="#所获荣誉">
                <span class="tocnumber">5</span>
                <span class="toctext">所獲榮譽</span>
            </a>
        </li>
        <li class="toclevel-1 tocsection-17"><a href="#影視形象"><span class="tocnumber">6</span> <span
                    class="toctext">影視形象</span></a></li>
        <li class="toclevel-1 tocsection-18"><a href="#注释"><span class="tocnumber">7</span> <span
                    class="toctext">注釋</span></a></li>
        <li class="toclevel-1 tocsection-19"><a href="#參考文獻"><span class="tocnumber">8</span> <span
                    class="toctext">參考文獻</span></a></li>
        <li class="toclevel-1 tocsection-20"><a href="#外部链接"><span class="tocnumber">9</span> <span
                    class="toctext">外部連結</span></a></li>
        <li class="toclevel-1 tocsection-21"><a href="#关联条目"><span class="tocnumber">10</span> <span
                    class="toctext">關聯條目</span></a></li>
        <li class="toclevel-1 tocsection-22"><a href="#参见"><span class="tocnumber">11</span> <span
                    class="toctext">參見</span></a></li>
    </ul>
</div>

我們先可以確切地找到目錄這個節點,並且print出來

<div id="toc" class="toc" role="navigation" aria-labelledby="mw-toc-heading">

find()用法:

把find想像是找到一個節點的所有資料

  • css搜尋
root = soup.find('div',class_="toc")
print(root)
  • html搜尋
root = soup.find('id = toc")
print(root)

這樣第一步就可以找到目錄的節點啦,我們再來看看如何使用find_all吧

find_all():

在使用find_all之後可以找到所有的子節點,並且會存成陣列的資料結構

root_child = root.find_all('li','toclevel-1')
print(root_child)

select():

使用Select可以更精密的對資料做爬取

# here is use select with html print
select_data = soup.select('div.toc > ul > li.toclevel-1')
print(select_data)

div.toc > ul > li.toclevel-1

  • 在於這邊">"的意思就是下一個節點的意思
  • "."的意思則是class 的意思

那我們可以利用這樣的方式可以更細部的拿取資料

小結:

當網站的class 或是html結構有改變了,在find 跟findall 你可以知道說哪個環節出錯了,而進行debug,使用select 雖然程式碼很簡略但你會不知道是哪個結構改變了,必須重新了解網站的架構

下一篇文章我們來談談如何儲存這些資料吧

說了這麼多,看完文章你做了甚麼?





還不給我分享起來~(ʘ言ʘ╬)

留言

這個網誌中的熱門文章

Vue那些我踩過的坑(Vuex-TypeScript)

Vue(Vue3取代 Vuex?)

前端優化效能-1(lazy-img)