Vấn đề của tôi là một vấn đề chung, làm thế nào để chuỗi một loạt các tra cứu thuộc tính khi một trong những trung gian có thể trả về None
, nhưng vì tôi gặp phải vấn đề này khi cố gắng sử dụng Beautiful Soup, tôi sẽ hỏi nó trong ngữ cảnh đó .Làm thế nào để tra cứu thuộc tính chuỗi có thể trả về None trong Python?
Soup đẹp phân tích cú pháp tài liệu HTML và trả về một đối tượng có thể được sử dụng để truy cập nội dung có cấu trúc của tài liệu đó. Ví dụ, nếu tài liệu phân tích cú pháp là trong biến soup
, tôi có thể nhận được danh hiệu của mình với:
title = soup.head.title.string
Vấn đề của tôi là nếu các tài liệu không có một tiêu đề, sau đó soup.head.title
lợi nhuận None
và sau string
tra cứu ném một ngoại lệ. Tôi có thể phá vỡ chuỗi như:
x = soup.head
x = x.title if x else None
title = x.string if x else None
nhưng điều này, để mắt của tôi, là dài dòng và khó đọc.
tôi có thể viết:
title = soup.head and soup.head.title and soup.title.head.string
nhưng đó là tiết và không hiệu quả.
Một giải pháp nếu nghĩ đến, mà tôi nghĩ là có thể, sẽ tạo một đối tượng (gọi là nil
) sẽ trả lại None
cho bất kỳ tra cứu thuộc tính nào. Điều này sẽ cho phép tôi viết:
title = ((soup.head or nil).title or nil).string
nhưng điều này khá xấu xí. Có cách nào tốt hơn?
lẽ giữ mã và bắt bạn + xử lý 'AttributeError' ngoại lệ trong trường hợp' None' được trả về. – crayzeewulf
Bạn muốn nó quay trở lại cái gì? – mgilson
['Maybe'monad in python] (http://stackoverflow.com/questions/8507200/maybe-kind-of-monad-in-python). Xem thêm [Monads in Python (với cú pháp đẹp!)] (Http://www.valuedlessons.com/2008/01/monads-in-python-with-nice-syntax.html) – jfs