find_all使用問題
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 😃😃😃