python - 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
吗?
解决方案
这是 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
推荐阅读
- c# - “CS1513 } 预期”当我已经有一个 }
- javascript - 如何在 url 中传递 javascript 变量
- mysql - 强制 liquibase 使用 current_timestamp 而不是 now()
- r - 修复删除 R 中的行(删除一列中具有特定负值的行)
- node.js - JOI - 如何要求一组字段中的至少一个字段
- r - 在 R 中使用克里金法进行外推
- php - 哈希后如何从url获取参数?
- python - 将值写入字典时迷失第一对?
- pyspark - 无法序列化调用外部 Web 服务的 Databricks UDF (PicklingError)
- neo4j - 在 Cypher/Neo4J 中创建组合与聚合关系