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

我需要用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 使得get永遠不會失敗.再利用字典的get與 bs tag 的get相似的特性就可以處理掉異常,對變數賦值為None

如果要寫的穩固一點的話,參考 @prolifes 的建議滿有幫助的.

下面有人問如果是find怎麼偷雞,那我這樣偷偷看,你知道的,偷雞的訣竅就是假資料:

from bs4 import BeautifulSoup html = '

hello world

' emptysoup = BeautifulSoup('', '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包含所有的分析语句,然后捕捉错误写日志,当页面抓取的越多还没有出错的话才能说明分析语句写的好

            최신 다운로드
            더>
            웹 효과
            웹사이트 소스 코드
            웹사이트 자료
            프론트엔드 템플릿
            회사 소개 부인 성명 Sitemap
            PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!