Python - 优化BeautifulSoup函数的技巧

2 投票
4 回答
629 浏览
提问于 2025-04-17 05:07

这段代码是能正常工作的,但我想知道有没有什么建议可以让它写得更好一点,特别是在使用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

这段代码里有很多不必要的部分。举几个例子:

inputList = []
inputList = getinputList()

在Python中,你不需要在给变量赋值之前先初始化它们。第二行代码单独放着就可以了。

if volumeatags:
   for volumeatag in volumeatags:

如果 volumeatags 是空的,for循环就不会执行。

1

你可以把代码放到一个函数里,然后把大部分的if语句改成负的形式,这样就可以用return、continue或者break语句。这可以减少很多缩进,让代码看起来更整洁。

另外,在一个for循环之前有一个if语句,看起来是多余的,因为如果列表是空的,for循环就会被跳过。

例如:

if volumeatags:
    for volumeatag in volumeatags:
            ...
3

我注意到你有很多这样的代码:

tags = parenttag.findAll('tag')

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

这里可以确定tags是一个列表,所以if tags:这一行是多余的。如果在for循环中使用一个空列表,那么循环体里的代码就不会执行。

另外,文件开头的inputList = []可以去掉,因为你马上就用函数调用把它覆盖了。

不太清楚这段代码是不是更大脚本的一部分,如果不是的话,建议你在inputList为空的时候直接结束,而不是把整个脚本放在一个if块里。

if not inputList:
    sys.exit(1)

而不是

if inputList:
    # process inputList

你需要在脚本的顶部添加import sys,这样才能正常工作。

撰写回答