我需要用bs4来分析一个html,需要写很多 提取语句,大概几十条,格式如下
twitter_url = summary_soup.find('a','twitter_url').get('href')
facebook_url = summary_soup.find('a','facebook_url').get('href')
linkedin_url = summary_soup.find('a','linkedin_url').get('href')
name = summary_soup.find('p', class_='name').find('a').string
但是每个语句都有可能出异常,如果每个语句都加上try except 就太繁琐了,有没有什么好的方法处理每条语句,出异常赋值为None,不中断程序
我在問題的評論裡面有提出一個小問題,如果能有回答,大家比較好掌握你的需求.
如果不想太多,純粹要避免掉
get
的時候可能會產生的錯誤,有個比較偷雞的方式,如果沒有太多奇怪的狀況要處理,也許你可以試試:如果說bs 的
與 bs tag 的find
沒有找到東西的話,會return None
,此時我們利用先利用or
來完成一個trick 使得find
沒有找到東西的話,會return None
,此時我們利用先利用or
來完成一個 trick 使得get
永遠不會失敗.再利用字典的get
與 bs tag 的get
相似的特性就可以處理掉異常,對變數賦值為None
永遠不會失敗.再利用字典的相似的特性就可以處理掉異常,對變數賦值為
None
.如果要寫的穩固一點的話,參考 @prolifes 的建議滿有幫助的.
下面有人問如果是find
怎麼偷雞,那我這樣偷偷看,你知道的,偷雞的訣竅就是假資料
:
結果:
偷雞成功!
我覺得這不是大量異常的問題,而是程式碼寫的問題,我大膽猜測一下,例如這句話:
twitter_url = summary_soup.find('a','twitter_url').get('href')
我覺得出錯的可能原因是:
summary_soup.find('a','twitter_url')
这一句没有找到元素,然后返回了None
,然后你用这个None
调用get('href')
,那肯定是拋錯啊。如果是這個原因的話,那處理起來就比較方便了,分兩段寫:
bs4的鍊式呼叫很讚,所以我把soup包裝了一下
參考 @prolifes
把可能報錯的地方自訂一個方法,在方法內部try
每一個都可能出異常那就是你分析html寫的問題了,分析html應該盡量考慮全面,,然後一個try except包含所有的分析語句,然後捕捉錯誤寫日誌,當頁面抓取的越多還沒有出錯的話才能說明分析語句寫的好