首页 > 解决方案 > hasattr 和 has_attr 之间的 Python 区别

问题描述

尽管有“类似措辞”的警告,但我认为没有人问过这个问题。

我开始使用 BeautifulSoup (v4),例如,要从 A 链接获取 href,您可以这样做:

for a_link in soup.html.body.select( 'a' ):
    print( a_link )
    if a_link.has_attr( 'href' ):
        print( a_link[ 'href' ])
    if a_link.has_attr( 'hrefXXX' ):
        print( "... also hrefXXX")
    print( hasattr( a_link, 'href' ) )
    print( hasattr( a_link, 'hrefXXX' ) )

...这里发生的是“也”行永远不会打印,但最后两行总是返回True!事实上,你把什么作为第二个参数似乎并不重要hasattr,它似乎总是返回True

由于无法解释hasattr的行为,我在尝试搜索后的第一个想法是,这has_attr可能是 BeautifulSoup 特有的。从搜索来看,情况确实如此:换句话说,这是在查找 HTML 标记是否具有“标记属性”。

另一方面,我有点怀疑它has_attr可能比 BeautifulSoup 有更广泛的应用。几年前我使用过 Jython,我感觉可能存在 ahas_attr和 a hasattr

有人可以解释为什么hasattr总是回来True吗?

标签: pythonbeautifulsoupjythonhasattr

解决方案


这是 bs4 API 的一部分。hasattr()总是True,因为您可以仅使用点语法 ( .) 选择标签。例如:

from bs4 import BeautifulSoup


txt = '''
<body>
    <hrefyyy>This is hrefyyy</hrefyyy>
</body>'''

soup = BeautifulSoup(txt, 'html.parser')

body = soup.find('body')

print( hasattr(body, 'hrefxxx' ))  # True
print( hasattr(body, 'hrefyyy' ))  # True

print( body.hrefxxx )     # <--- this is not error, it just returns `None`
print( body.hrefyyy )     # <--- returns <hrefyyy> tag

印刷:

True
True
None
<hrefyyy>This is hrefyyy</hrefyyy>

笔记:

a_link.has_attr( 'hrefXXX' )

将尝试查找<hrefXXX>标签下的所有<has_attr>标签,但返回空ResultSet


推荐阅读