我想将 BeautifulSoup 的 Node 对象放入 dict 中,并且我想覆盖 __hash__
以提供我自己的基于节点路径的哈希实现。
def __hash__(self):
def convert_attrs(attrs):
for k, v in attrs.iteritems():
if isinstance(v, list):
v = tuple(v)
yield k, v
reverse_path = []
node = self.node
while node:
node_id = (node.name,
tuple(convert_attrs(node.attrs)),
node.text)
reverse_path.append(node_id)
node = node.parent
return hash(tuple(reverse_path))
但这会在某些具有完全相同路径和属性的节点上发生冲突。我可以使用节点在父子集合中的索引来构造唯一路径,但查找索引的成本太高。那么在 html 节点对象上实现 __hash__
有什么好的建议吗?无论如何要实现不基于路径但仍然可以正常工作的哈希?
更新:为什么我要散列节点?
我想给每个节点一个分数,所以我需要一些东西作为键来放入散列。 BeautifulSoup 似乎返回具有不同对象的相同节点(我的意思是它在再次访问相同节点时创建新的对象),所以我想找到一种方法来唯一标识哈希中的节点。
最佳答案
假设有两个节点,它们的标签相同,属性相同,父节点相同,内容相同,但它们不同,因为它们是兄弟节点。我认为如果你想区分它们,你必须找到索引。您可以使用 nextSibling
或 previousSibling
,例如
i,t = 0 , node
while t:
t = t.previousSibling
i += 1
我没有测试,所以我不知道成本。
关于python - 在 Python 中计算对象的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20367692/