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