【问题标题】:Python difference between hasattr and has_attrhasattr 和 has_attr 之间的 Python 区别
【发布时间】:2020-10-14 10:17:04
【问题描述】:

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

我开始使用 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

【问题讨论】:

  • 您知道hasattr 是Python 内置函数,而.has_attr 是BeautifulSoup 特有的方法吗?
  • 我知道hasattr 是内置的,是的。正如我的问题所暗示的那样,我不确定has_attr

标签: python beautifulsoup jython hasattr


【解决方案1】:

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

将尝试查找&lt;has_attr&gt;标签下的所有&lt;hrefXXX&gt;标签,但返回空ResultSet

【讨论】:

  • 感谢您的解释,但老实说我不太明白:将True 回复到每个hasattr 电话似乎非常具有误导性。 soup.html 实际上有一个 body “属性”(在 Python 意义上,而不是“HTML 标签”意义上)。但在您的示例中,body 没有hrefxxx“属性”。但我是一个底层的 Python 人:我只需要尝试掌握它。
猜你喜欢
  • 2021-06-10
  • 2021-01-02
  • 2016-03-26
  • 2011-03-24
  • 2014-01-03
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多