问题描述
尽管有“措辞相似”的警告,但我认为没有人问过。
我开始使用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_attr
和hasattr
。
有人可以解释为什么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