贪婪地执行陈述?

时间:2010-11-06 19:51:49

标签: python beautifulsoup

我使用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

但是我如何以贪婪的方式执行这些陈述?例如,如果只有两个元素可用codecoded,我只想获取这些元素并继续执行。截至目前,即使存在codecoded,如果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

但这是一个丑陋的方法,我想要更清洁。有什么建议吗?

2 个答案:

答案 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:
    ...