hasattr和has_attr之间的Python差异
尽管有“类似措辞”的警告,我认为没有人问过这个问题 我开始使用BeautifulSoup(v4),例如,要从A链接获取href,您可以执行以下操作:hasattr和has_attr之间的Python差异,python,beautifulsoup,jython,hasattr,Python,Beautifulsoup,Jython,Hasattr,尽管有“类似措辞”的警告,我认为没有人问过这个问题 我开始使用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' ):
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
的行为,在尝试搜索之后,我的第一个想法是hasattr
可能非常特定于BeautifulSoup。从搜索来看,情况似乎确实如此:换句话说,这是在查找HTML标记是否具有“标记属性”
另一方面,我有点怀疑has_attr
可能比BeautifulSoup有更广泛的应用。几年前我用过Jython,我觉得可能有一个has\u attr
和一个hasattr
有人能解释为什么
hasattr
总是返回True
?这是BS4API的一部分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
将尝试在
标记下查找所有
标记,但返回空的ResultSet
您是否知道hasattr
是Python内置的,而.has\u attr
是专门用于美化组的方法?我知道hasattr
是内置的,是的。正如我的问题所暗示的那样,我不确定是否有属性。谢谢你的解释,但我真的不太明白:对每个hasattr
调用返回True
似乎非常误导soup.html
实际上有一个body
“属性”(在Python意义上,而不是“html标记”意义上)。但是在您的示例中,body
没有hrefxxx
属性。但我是一个底层Python人员:我只需要尝试并掌握它。
True
True
None
<hrefyyy>This is hrefyyy</hrefyyy>
a_link.has_attr( 'hrefXXX' )