hasattr和has_attr

问题描述

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

我开始使用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,感觉好像有has_attrhasattr

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

解决方法

这是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