Плюс за lxml, кроме этого, у него еще есть iterparse который не загружает в память весь DOM
При удалении экземпляра класса, память всё же высвобождается. Но для меня это увы не вариант, так-как нужно передать объект дальше.
А вот тут можно посоветовать разделить на две части:
1. Часть парсинга, которая содержит "проблемные", с точки высвобождения памяти, объекты. После отработки парсера, не используется.
2. "Чистые" данные, результат парсинга, без ссылок на bs и т.п.