logo
Loading...

find_all使用問題 - Cupoy

Hi, 老師不好意思有個比較基本的問題請教一下在 Sample 中的這段 Codefor d in ...

pycrawler,pycrawler-d12

find_all使用問題

2020/03/20 下午 01:49
Python網路爬蟲討論版
許義翔
觀看數:6
回答數:2
收藏數:0
pycrawler
pycrawler-d12

Hi, 老師

不好意思有個比較基本的問題請教一下

在 Sample 中的這段 Code


for d in soup.find(class_="part_list_2").find_all('h3'):
    print(d.find(class_="date").text, d.find_all('a')[-1].text)


其中 d.find_all('a')[-1].text,為什麼這邊要採用 -1 呢?而不是採用 0 來返回list呢?是否有特別意義?

謝謝!

回答列表

  • 2020/03/20 下午 04:14
    許義翔
    贊同數:0
    不贊同數:0
    留言數:0

    另外再請教一個問題,關於 find_all() 與 find() 的差異性,我查到的解釋如下

    find() 只回傳第一個找到的區塊,而 find_all() 會回傳一個 list, 包含所有符合條件的區塊。傳入的引數第一個通常是 tag 名稱,第二個引數若未指明屬性就代表 class 名稱,也可以直接使用 id 等屬性去定位區塊。定位到區塊後,可以取出其屬性與包含的字串值。兩者看起來定義大部分相似,唯一不同時 findAll() 中多了一個參數 limit。在實際使用中,find() 就相當於 findAll() 中 limit = 1 時的特殊情況。

    但是在範例中一下使用 find(),一下使用 findAll(),不知道判斷使用的時機點為何?

    可否再請您說明一下,謝謝!

  • 2020/03/21 上午 01:20
    張維元 (WeiYuan)
    贊同數:6
    不贊同數:0
    留言數:0

    嗨,益翔你好


    1. 你的第一個問題「d.find_all('a')[-1].text」,因為當時觀察的時候發現該區塊下有可能會有廣告出現,廣告也會用 <a> 的方式存在,有時候會抓到的是廣告的 <a>。所以,這邊改成抓「最後一個 <a>」,不管有沒有廣告都會抓到正確的。


    2. 「關於 find_all() 與  find() 的差異性」在於一個會回傳 HTML 物件,一個會回傳包含 HTML 物件所組成的 List,因此 find('a') 會等同於 find_all('a')[0] 的結果。大部分情況,如果條件下得夠好,可以採用 find 就好,但有些時候條件不好下,只能用某個條件中的第 N 個的規則找到,就非得改用 find_all 再加上位置。另外 find_all 也會用在資料有規則的情況,例如我們想要抓所有的新聞(每一則新聞的 HTML 是類似的),我們也會採用 find_all。


    如果這個回答對你有幫助請主動點選「有幫助」的按鈕,也可以追蹤我的GITHUB帳號。若還有問題的話,也歡迎繼續再追問或者把你理解的部分整理上來,我都會提供你 Review 和 Feedback 😃😃😃