-
11-10-2019 - |
题
因此,我有以下一组代码解析美味的信息。它以以下格式从美味页面上打印数据
书签|人数
书签|人数等...
我曾经使用以下方法查找此信息。
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'})
其他提示
如果您担心性能,您可能会看一些与美味API交谈的东西,而不是屏幕剪彩,即 Pydelicious. 。例如:
>>> import pydelicious
>>> pydelicious.get_userposts('asd')
[{'extended': '', 'description': u'Ksplice - System administration and software blog', 'tags': u'sysadm, blog, interesting', 'url': u'http://blog.ksplice.com/', 'user': u'asd'
在这种情况下,BeautifulSoup所做的比您需要的要多得多。如果您真的想提高速度,那么我建议您采用更基本的urllib +简单的按线解析器。
解析类似“ ASD”示例大小的页面应在现代机器上一秒钟以下。
不隶属于 StackOverflow