Heim > Fragen und Antworten > Hauptteil
我需要用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,不中断程序
ringa_lee2017-04-18 09:05:01
我在問題的評論裡面有提出一個小問題,如果能有回答,大家比較好掌握你的需求.
如果不想太多,純粹要避免掉 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 = '<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
大家讲道理2017-04-18 09:05:01
我觉得这不是大量异常的问题,而是代码编写的问题,我大胆猜测一下,例如这句:
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
PHP中文网2017-04-18 09:05:01
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
PHPz2017-04-18 09:05:01
每一个都可能出异常那就是你分析html写的问题了,分析html应该尽量考虑全面,,然后一个try except包含所有的分析语句,然后捕捉错误写日志,当页面抓取的越多还没有出错的话才能说明分析语句写的好