我使用BeautifulSoup有这样的东西:
for line in lines:
code = l.find('span', {'class':'boldHeader'}).text
coded = l.find('div', {'class':'Description'}).text
definition = l.find('ul', {'class':'definitions'}).text
print code, coded, def
但是,并非所有元素都始终存在。我可以将它包含在一个尝试中,除非它不会像这样破坏程序执行:
for line in lines:
try:
code = l.find('span', {'class':'boldHeader'}).text
coded = l.find('div', {'class':'Description'}).text
definition = l.find('ul', {'class':'definitions'}).text
print code, coded, def
except:
pass
但是我如何以贪婪的方式执行这些陈述?例如,如果只有两个元素可用code
和coded
,我只想获取这些元素并继续执行。截至目前,即使存在code
和coded
,如果def
不存在,也永远不会执行打印命令。
这样做的一种方法是为每个语句添加try...except
:
for line in lines:
try:
code = l.find('span', {'class':'boldHeader'}).text
except:
pass
try:
coded = l.find('div', {'class':'Description'}).text
except:
pass
try:
definition = l.find('ul', {'class':'definitions'}).text
except:
pass
print code, coded, def
但这是一个丑陋的方法,我想要更清洁。有什么建议吗?
答案 0 :(得分:3)
首先,您可以测试None而不是捕获异常。 l.find
如果找不到您的商品,应该返回None
。应该为错误和非常特殊情况保留例外。
您可以做的第二件事是创建一个包含要检查的所有HTML元素的数组,然后使用嵌套的for循环。由于我已经使用了python已经有一段时间了,我将概述代码,然后(希望)在我测试时编辑答案。
类似的东西:
elementsToCheck = [
[ 'span', {'class':'boldHeader'} ],
[ 'div', {'class':'Description'} ],
[ 'ul', {'class':'definitions'} ]]
concatenated = ''
for line in lines:
for something in elementsToCheck
element = l.find(something[0], something[1])
if element is not None
concatenated += element.text
print concatenated
显然上面的代码不起作用,但你应该明白。 :)
答案 1 :(得分:3)
如何捕获函数中的“丑陋”代码,并根据需要调用该函数:
def get_txt(l,tag,classname):
try:
txt=l.find(tag, {'class':classname}).text
except AttributeError:
txt=None
return txt
for line in lines:
code = get_txt(l,'span','boldHeader')
coded = get_txt(l,'div','Description')
defn = get_txt(l,'ul','definitions')
print code, coded, defn
PS。我将def
更改为defn
,因为def
是Python关键字。将它用作变量名称会引发SyntaxError。
PPS。使用裸异常并不是一个好习惯:
try:
....
except:
...
因为它几乎总能捕获更多你想要的东西。更好地明确你想要抓住的东西:
try:
...
except AttributeError as err:
...