Scraping urls asynchronous including exception handling
tasks = []
while urls:
    tasks.append(fetch(session, urls.pop()))



can be largely simplified to

tasks = [fetch(session, url) for url in urls]





  Is it possible to remove the result of a specific url from results in case of an exception - making return (url, '') unnecessary?


Yes, somewhat. asyncio.gather accept a return_exceptions parameters. Set it to True to avoid a single exception failing the gather call. You must filter them out afterwards anyway:

import asyncio
import aiohttp


async def fetch(session, url):
    async with session.get(url, ssl=False) as response:
        return await response.text()


async def main():
    urls = [
        'http://www.python.org',
        'http://www.jython.org',
        'http://www.pypy.org'
    ]
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        results = await asyncio.gather(*tasks)

    for url, result in zip(urls, results):
        if not isinstance(result, Exception):
            print(f'{url}: {len(result)}')
        else:
            print(f'{url} FAILED')


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()