我想将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))
但是这会在一些具有完全相同路径和attrs的节点上产生冲突。我可以在父的子集合中使用node的索引来构造一个唯一的路径,但是查找索引的成本太高。那么在html节点对象上实现__hash__
的任何好建议呢?无论如何要实现不基于路径但仍能正常工作的哈希?
更新:为什么我要哈希节点?
我想给每个节点一个分数,所以我需要一些东西作为放入哈希的关键。 BeautifulSoup似乎返回具有不同对象的相同节点(我的意思是它在再次访问同一节点时创建新节点),所以我想找到一种方法来唯一地标识散列中的节点。
答案 0 :(得分:0)
假设有两个节点,它们的标签相同,属性相同,父节点相同,内容相同,但它们不同,因为它们是兄弟节点。如果你想区分它们,我认为你必须找到索引。您可以使用nextSibling
或previousSibling
,例如
i,t = 0 , node
while t:
t = t.previousSibling
i += 1
我不测试,所以我不知道费用。