Skip to main content
 首页 » 编程设计

python之改善 BeautifulSoup 性能

2025年05月04日18EasonJim

所以我有下面这组代码解析好吃的信息。它以下列格式从 Delicious 页面打印数据

书签 |人数

书签 |人数 等等……

我曾经使用以下方法来查找此信息。

def extract (soup): 
    links = soup.findAll('a',rel='nofollow') 
    for link in links: 
        print >> outfile, link['href'] 
 
    hits = soup.findAll('span', attrs={'class': 'delNavCount'}) 
    for hit in hits: 
        print >> outfile, hit.contents 
 
 
#File to export data to 
outfile = open("output.txt", "w") 
 
#Browser Agent 
br = Browser()     
br.set_handle_robots(False) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
 
 
url= "http://www.delicious.com/asd" 
page = br.open(url) 
html = page.read() 
soup = BeautifulSoup(html) 
extract(soup) 

但问题是有些书签没有人数,所以我决定不同地解析它,这样我就可以并发获取数据并将书签和人数并排打印出来。

编辑:使用此更新版本从 15 到 5 秒内完成,还有更多建议

def extract (soup): 
    bookmarkset = soup.findAll('div', 'data') 
    for bookmark in bookmarkset: 
        link = bookmark.find('a',) 
        vote = bookmark.find('span', 'delNavCount') 
        try: 
            print >> outfile, link['href'], " | " ,vote.contents 
        except: 
            print >> outfile, "[u'0']" 
    #print bookmarkset 
 
 
#File to export data to 
outfile = open("output.txt", "w") 
 
#Browser Agent 
br = Browser()     
br.set_handle_robots(False) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
 
 
url= "http://www.delicious.com/asd" 
page = br.open(url) 
html = page.read() 
soup = BeautifulSoup(html) 
extract(soup) 

虽然这方面的性能很糟糕,解析第一页需要 17 秒,而在相当不错的机器上解析此后大约需要 15 秒。从第一位代码到第二位代码时,它的性能明显下降。我可以做些什么来提高性能吗?

请您参考如下方法:

我不明白你为什么分配给vote – 两次。第一个赋值是不必要的,而且确实非常繁重,因为它必须在每次迭代时解析整个文档。为什么?

   vote = BeautifulSoup(html) 
   vote = bookmark.findAll('span', attrs={'class': 'delNavCount'})