python3.x - python 如何优雅的处理大量异常语句?
高洛峰
高洛峰 2017-04-18 09:03:01
0
5
426

我需要用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,不中断程序

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(5)
左手右手慢动作

我在問題的評論裡面有提出一個小問題,如果能有回答,大家比較好掌握你的需求.

如果不想太多,純粹要避免掉 get 的時候可能會產生的錯誤,有個比較偷雞的方式,如果沒有太多奇怪的狀況要處理,也許你可以試試:

twitter_url = (summary_soup.find('a','twitter_url') or {}).get('href')

如果說bs 的find 沒有找到東西的話,會return None,此時我們利用先利用or 來完成一個trick 使得find 沒有找到東西的話,會 return None,此時我們利用先利用 or 來完成一個 trick 使得 get 永遠不會失敗.再利用字典的 get 與 bs tag 的 get 相似的特性就可以處理掉異常,對變數賦值為 None 永遠不會失敗.再利用字典的

與 bs tag 的

相似的特性就可以處理掉異常,對變數賦值為 None

如果要寫的穩固一點的話,參考 @prolifes 的建議滿有幫助的. find 怎麼偷雞,那我這樣偷偷看,你知道的,偷雞的訣竅就是 假資料

下面有人問如果是

:

from bs4 import BeautifulSoup

html = '<p class="name"><a href="www.hello.com">hello world</a></p>'

emptysoup = BeautifulSoup('<a></a>', 'xml')
soup = BeautifulSoup(html, 'xml')

name = (soup.find('p', class_='name') or emptysoup).find('a').string
print(name)
name = (soup.find('p', class_='nam') or emptysoup).find('a').string
print(name)

結果:

hello world
None

偷雞成功!

我回答過的問題🎜: Python-QA🎜
大家讲道理

我覺得這不是大量異常的問題,而是程式碼寫的問題,我大膽猜測一下,例如這句話:

twitter_url = summary_soup.find('a','twitter_url').get('href')

我覺得出錯的可能原因是: summary_soup.find('a','twitter_url') 这一句没有找到元素,然后返回了 None,然后你用这个None调用 get('href'),那肯定是拋錯啊。

如果是這個原因的話,那處理起來就比較方便了,分兩段寫:

twitter_url_a = summary_soup.find('a','twitter_url')
twitter_url = twitter_url_a.get('href') if twitter_url_a else None
Ty80

bs4的鍊式呼叫很讚,所以我把soup包裝了一下


class MY_SOUP():
    '''
    包装类
    '''
    def __init__(self,soup):
        self.soup = soup
        if soup:
            if soup.string:
                self.string = soup.string.strip()
            else:
                self.string = None
        else:
            self.string = None

    def find(self, *args, **kw):
        ret = self.soup.find(*args, **kw)
        if ret:
            return FIND_SOUP(ret)
        return FIND_SOUP(None)

    def find_all(self,*args, **kw):
        ret = self.soup.find_all(*args, **kw)
        return ret

    def get_text(self):
        if self.soup:
            return self.soup.get_text().strip()
        return None

    def get(self,*args, **kw):
        if self.soup:
            return self.soup.get(*args, **kw)
        return None

soup = BeautifulSoup(html,'lxml')
summary_soup = soup.find('p', class_='summary')

#把 summary_soup 包装成我的soup
summary_soup = MY_SOUP(summary_soup)

#再也没有None异常了
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
...

參考 @prolifes

左手右手慢动作

把可能報錯的地方自訂一個方法,在方法內部try

PHPzhong

每一個都可能出異常那就是你分析html寫的問題了,分析html應該盡量考慮全面,,然後一個try except包含所有的分析語句,然後捕捉錯誤寫日誌,當頁面抓取的越多還沒有出錯的話才能說明分析語句寫的好

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板