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

我需要用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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(5)
左手右手慢动作

J'ai posé une petite question en commentaire de la question. Si vous pouvez y répondre, il sera plus facile pour chacun de comprendre vos besoins.

Si vous ne voulez pas trop réfléchir et souhaitez simplement éviter les erreurs qui peuvent survenir lorsque get, il existe une manière plus furtive s'il n'y a pas trop de situations étranges à gérer, vous pouvez peut-être le faire. essayez :

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

Si bs's find ne trouve rien, ce sera return None A ce moment, nous utilisons or pour réaliser une astuce afin que get n'échoue jamais. En utilisant les fonctionnalités similaires du get du dictionnaire et de la balise bs get, vous pouvez gérer les exceptions et attribuer des valeurs aux variables comme None.

Si vous souhaitez écrire avec plus de fermeté, il vous sera très utile de vous référer aux suggestions de @prolifes.

Quelqu'un ci-dessous a demandé comment voler un poulet si c'était find, puis j'ai jeté un coup d'œil comme ça, vous savez, l'astuce pour voler un poulet est 假資料 :

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)

Résultat :

hello world
None

Voler le poulet avec succès !


Questions auxquelles j'ai répondu : Python-QA

大家讲道理

Je pense que ce n'est pas un problème d'un grand nombre d'exceptions, mais un problème d'écriture de code. Je vais faire une supposition audacieuse, comme cette phrase :

.

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

Je pense que la raison possible de l'erreur est : summary_soup.find('a','twitter_url') Cette phrase n'a pas trouvé l'élément, puis est revenue None, puis vous avez utilisé ce None pour appeler get('href'), alors ce doit être un erreur.

Si c'est la raison, ce sera plus facile à gérer. Écrivez-le en deux paragraphes :

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

L'appel en chaîne de bs4 est très bon, alors j'ai emballé la soupe


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
...

Référence @prolifes

左手右手慢动作

Personnalisez une méthode dans laquelle des erreurs peuvent être signalées et essayez à l'intérieur de la méthode

PHPzhong

Chaque exception peut se produire, ce qui pose problème lorsque vous analysez l'écriture HTML. Lors de l'analyse du code HTML, vous devez essayer d'être aussi complet que possible, puis un essai sauf contient toutes les instructions d'analyse, puis capture les erreurs. et écrit le journal. Plus de pages sont capturées, Ce n'est que s'il n'y a pas d'erreurs que cela peut signifier que la déclaration d'analyse est bien écrite

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal