Python - 关于重写BeautifulSoup功能的提示更优雅

时间:2011-10-27 15:32:43

标签: python if-statement beautifulsoup conditional-operator

代码正在运行,但我正在寻找有关如何更恰当地编写这些代码的提示,尤其是if的使用。正如你所知道的那样,我本质上不是程序员...只是一个系统管理员在python中做一点点摆弄。感谢您提供的任何建议。

def findallWileyLinks():

pagebase = 'http://onlinelibrary.wiley.com'
journallist = 'http://onlinelibrary.wiley.com/browse/publications?type=journal&&start=0&resultsPerPage=3000'

inputList = getinputList()

if inputList:
  alljournallistsoup = BeautifulSoup(getwebpage(journallist))

  if alljournallistsoup:
    alljournallisttags = alljournallistsoup.find('ol', attrs={'id' : 'publications'})

    for eissn in inputList:
      journalatag = alljournallisttags.find('a', attrs={'href' : re.compile(eissn.rstrip() + '$')})

      if journalatag:
        journalsoup = BeautifulSoup(getwebpage(pagebase + journalatag.get('href') + '/issues'))

        if journalsoup:
          allvolumetags = journalsoup.find('ol', attrs={'class' : 'issueVolumes'})
          volumeatags = allvolumetags.findAll('a')

            for volumeatag in volumeatags:
              volumesoup = BeautifulSoup(getwebpage(pagebase + volumeatag.get('href')))

              if volumesoup:
                allissuetags = volumesoup.find('li', attrs={'id' : volumeatag.get('id')[:-5]})
                issueatags = allissuetags.findAll('a')[1:]

                  for issueatag in issueatags:
                    currentlinksavailiable.append(pagebase + issueatag.get('href') + '\n')

      else:
        appendlog('eISSN: ' + eissn.rstrip() + ' not found on alljournallist page.')

    try:
      with open(inputDirectory + selectedPublisher + '_currentlinksavailiable.txt', 'w') as f:
          f.writelines(currentlinksavailiable)

    except IOError as e:
      appendlog('findallLinks() Operation failed probably when creating the new link text file with error: %s' % e.strerror)

4 个答案:

答案 0 :(得分:3)

对我而言,有一件事就是你有很多形式的代码:

tags = parenttag.findAll('tag')

if tags:
    for tag in tags:
        # do something to tag

我们保证tags是一个列表,因此if tags:行是多余的。如果在for循环中使用空列表,则不执行循环体。

作为一个小点,文件的开头inputList = []可以在您使用函数调用立即覆盖它时删除。

目前尚不清楚这是否是更大脚本的一部分,但如果不是,那么在if块中包含脚本正文时,如果inputListif not inputList: sys.exit(1) ,则应该终止空。

if inputList:
    # process inputList

而不是

import sys

您需要在脚本顶部添加{{1}}才能使其正常工作。

答案 1 :(得分:1)

您可以将代码放在函数中,并使大多数if语句为负,并使用return,continue或break语句。这样可以避免这么多缩进。

此外,在for循环之前有一个if语句看起来不需要,因为如果列表为空,则跳过for循环。 即

if volumeatags:
    for volumeatag in volumeatags:
            ...

答案 2 :(得分:0)

很多代码都是不必要的。一些例子:

inputList = []
inputList = getinputList()

在Python中,您不需要在为其分配数据之前初始化变量。第二行本身就没问题。

if volumeatags:
   for volumeatag in volumeatags:

如果volumeatags为空,则for循环不会执行。

答案 3 :(得分:0)

我认为在这里要求重写是不常见的。无论如何,这是我的反馈。

if foo:
    if bar:
        #code

替换为(asusming,你在def内,但你是,对吗?

if not foo:
    return
if bar:
    #code

注释应以hash-blank-uppercase开头,为已注释掉的代码保留hash-lowercase。 Peter Norvig似乎在文本评论中加入了两个破折号。无论如何,你有太多的评论。代码应该足够描述。如果操作块需要一个descritive头,请在函数中移动它并使用此描述作为函数名。它也有助于隔离事物。

请勿使用for foo保护if foo次圈,如其他答案中所述。

inputList = []没用,而且不符合PEP08,请尝试input