bin*_*olo 5 python beautifulsoup
我正在解析显示商品数据的网站上的网页.这些物品有大约20个可能会或可能不会发生的字段 - 例如:价格,数量,上次购买,高,低等.
我目前正在使用一系列命令; 大约20行soup.find('div',{'class':SOME_FIELD_OF_INTEREST})寻找每个单独的感兴趣的领域.(有些人在div,span,dd,等等,所以它很难只是做一个soup.find_all('div')命令.)
我的问题:是否有一种优雅的方式try和except所有内容,以便查看所述代码可以更紧凑或简洁?现在,示例行看起来像:
try:
soup.find('div', {'id':'item-pic'}).img["src"]
except:
""
Run Code Online (Sandbox Code Playgroud)
我希望将所有内容组合在一起.我不认为我可以在语法上运行try : <line of code> except: <code>,而且我不确定如何编写一个try_command(soup.find('div',{'id':'item-pic'}).img["src"])没有实际运行命令的函数.
我很想知道是否有人有任何建议(包括:"这不可能/不实用,继续前进").:)
编辑:在谈了一下后,我想我想看看内联异常处理的好习惯是什么,如果这是正确的路线.
也许是这样的:
def try_these(start_obj, *args) :
obj = start_obj
for trythat in args :
if obj is None :
return None
try :
if isinstance(trythat, str) :
obj = getattr(obj, trythat)
else :
method, opts = trythat
obj = getattr(obj, method)(*opts)
except :
return None
return obj
src = try_these(soup, ('find', ({'id':'item-pic'},),),
'img',
('get', ('src',),) )
Run Code Online (Sandbox Code Playgroud)
您可以在其中传递从对象或(str方法,元组参数)str获取属性,最后您将得到或结果。我对汤不熟悉,所以我不确定是否是一个好方法(因为可能它不是字典),无论如何,您可以轻松修改该代码片段以接受不仅仅是“调用或属性”的内容。tupleNoneget('src')
受到你的问题的启发,我编写了简单的 python 模块来帮助处理这种情况,你可以在这里找到它
import silentcrawler
wrapped = silentcrawler.wrap(soup)
# just return None on failure
print wrapped.find('div', {'id':'item-pic'}).img["src"].value_
# or
def on_success(value) :
print 'found value:', value
wrapped = silentcrawler.wrap(soup, success=on_success)
# call on_success if everything will be ok
wrapped.find('div', {'id':'item-pic'}).img["src"].value_
Run Code Online (Sandbox Code Playgroud)
还有更多的可能性