为何Beautiful Soup部分元素用字典语法访问,部分用对象语法?
Beautiful Soup 属性访问语法差异解析
背景代码
tags = soup.find_all('span', {'class': 'tags-links'}) title_text_list = [(tag['title'], tag.text) for tag in tags]
用户疑问
为何采用字典语法访问title属性,却使用对象语法访问text属性?为何不统一使用其中一种语法?
解答
这是因为Beautiful Soup对HTML元素的原生HTML属性和自身封装的便捷属性做了明确区分:
- 字典语法
tag['attr_name']是直接访问HTML元素本身自带的原生属性(比如title、class、href这些写在标签里的属性),完全对应你在HTML源码里看到的属性,逻辑直观。 - 而
tag.text是Beautiful Soup为了简化文本提取操作,专门封装的属性(本质是tag.get_text()方法的简写),它不属于HTML元素的原生属性,所以采用对象属性的访问方式。
其实两种场景也可以交叉使用替代写法:
- 原生属性也能用
tag.get('title')(字典的get方法,还能处理属性不存在的情况)或者tag.attrs['title']来获取; - 文本内容除了
tag.text,还可以用tag.string(仅适用于元素只有单个文本节点的情况)或者tag.get_text()来提取。
Beautiful Soup这么设计,核心是兼顾原生HTML逻辑的直观性和常用操作的便捷性——原生属性用字典语法贴近源码,高频的文本提取做封装简化,让写代码更顺手。
内容的提问来源于stack exchange,提问作者BLimitless
相关产品推荐
相关产品推荐

