Как грамотно сделать (парсинг)?

Доброго времени суток. Изучаю Питон и сейчас решил решить задачу по парсингу. Использую BeautifulSoup и requests.

Есть сайт авиакомпании. Я хочу спарсить предложения авиакомпании вида - Маршрут, Цена и ссылка.
Ссылка откуда беру информацию https://www.alrosa.aero/info/special-offers, в итоге делаю вот так:
def alrosa(link, header):
    r = requests.get(link, headers= header)
    html = BeautifulSoup(r.content,'html.parser')
    citylist = []; pricelist = []; linkdeplist = []
    for city in html.select('.city'):
        citylist.append(city.text)

    for price in html.select('.price'):
        pricelist.append(price.text)  
     
    for linkdep in html.select('.button a'):
        linkdeplist.append(linkdep.get('href'))
    i = 0
    while i < len(citylist):
        print('Маршрут: ' + citylist[i] + '. Цена: ' + pricelist[i] + '. Ссылка- ' + linkdeplist[i])
        i += 1

alrosa(config.urls['alrosa'],config.headers)

Всё работает. Но помоему выглядит неправильно. 3 цикла да и вывод... в общем смущает меня то, как у меня получилось, хоть оно и работает.
Подскажите, как выполнить правильно, чтобы это было грамотно с точки зрения кода. Спасибо большое за советы. Хочется услышать мнение опытных ребят. Спасибо.
  • Вопрос задан
  • 121 просмотр
Пригласить эксперта
Ответы на вопрос 1
LazyTalent
@LazyTalent
Data Engineer, Freelancer
Я бы это в ООП переписал, как-то так (Обязательно добавить обработку ошибок!!!):
class Alrosa:
    def __init__(self, page_source: str):
        self.html = BeautifulSoup(page_source, 'html.parser')

    @property
    def citylist(self) -> List[str]:
        return self._get_elements('.city')

    @property
    def pricelist(self) -> List[str]:
        return self._get_elements('.price')

    @property
    def linkdeplist(self) -> List[str]:
        elems = self._get_elements('.button a')
        return [i.get('href') for i in elems]

    def _get_elements(self, selector: str) -> List[str]:
        return [elem for elem in self.html.selector(selector)]

    def to_string(self, i: int) -> str:
        return f'Маршрут: {self.citylist[i]}. Цена: {pricelist[i]}. Ссылка-{linkdeplist[i]}'
    
    
def get(url: str, headers: Dict[str, str]) -> requests.Response:
    return requests.get(url, headers=headers)

r = get(url, headers)
alrosa = Alrosa(r.content)
for i in range(len(alrosa.citylist)):
    print(alrosa.to_string(i))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы