Моя проблема является общей, как связать серию поиска атрибутов, когда один из промежуточных может вернуться None
, но так как я столкнулся с этой проблемой, пытаясь использовать Beautiful Soup, я собираюсь спросить об этом в этом контексте.
Beautiful Soup анализирует HTML-документ и возвращает объект, который можно использовать для доступа к структурированному контенту этого документа. Например, если анализируемый документ находится в переменной soup
, я могу получить его заголовок с помощью:
title = soup.head.title.string
Моя проблема в том, что если документ не имеет названия, то soup.head.title
возвращает None
, а последующий поиск string
вызывает исключение. Я мог бы разбить цепочку как:
x = soup.head
x = x.title if x else None
title = x.string if x else None
но это, на мой взгляд, многословно и трудно читается.
Я мог бы написать:
title = soup.head and soup.head.title and soup.title.head.string
но это многословно и неэффективно.
Одним из решений, которое, по моему мнению, является возможным, было бы создание объекта (назовем его nil
), который возвратит None
для любого поиска атрибутов. Это позволило бы мне написать:
title = ((soup.head or nil).title or nil).string
но это довольно уродливо. Есть ли лучший способ?