first_h1和second_h1是my_dict[first_h1]或my_dict[second_h1]时,标记的字符串表示形式用于哈希。问题是,这两个Tag实例具有相同的字符串表示形式:
some_header
这是因为Tag类具有__hash__()魔术方法的定义如下:
^{pr2}$
解决方法之一可能是使用^{}值作为散列值,但是存在重新定义Tag类的问题。你可以自己解决这个问题class TagWrapper:
def __init__(self, tag):
self.tag = tag
def __hash__(self):
return id(self.tag)
def __str__(self):
return str(self.tag)
def __repr__(self):
return str(self.tag)
然后,您将能够:In [1]: from bs4 import BeautifulSoup
...:
In [2]: class TagWrapper:
...: def __init__(self, tag):
...: self.tag = tag
...:
...: def __hash__(self):
...: return id(self.tag)
...:
...: def __str__(self):
...: return str(self.tag)
...:
...: def __repr__(self):
...: return str(self.tag)
...:
In [3]: HTML_string = "
some_header
some_header
"...:
...: HTML_soup = BeautifulSoup(HTML_string, 'lxml')
...:
In [4]: first_h1 = HTML_soup.find_all('h1')[0] #first_h1 =
some_header
...: second_h1 = HTML_soup.find_all('h1')[1] #second_h1 =
some_header
...:
In [5]: my_dict = {}
...: my_dict[TagWrapper(first_h1)] = 1
...: my_dict[TagWrapper(second_h1)] = 1
...:
...: print(my_dict)
...:
{
some_header
: 1,some_header
: 1}不过,它并不漂亮,使用起来也不太方便。我会重申你最初的问题,并检查你是否真的需要把标签放入字典。在
您也可以使用Python的自省功能(如it was done here)来修补bs4,但这将进入一个相当危险的领域。在