我的程序中收到以下错误:
Traceback (most recent call last):
File "bookmarks.py", line 26, in <module>
zipping = dict(zip(datelist, matchhref))
TypeError: unhashable type: 'list'
我想从两个列表(datelist
和matchhref
)创建字典,但不知何故,当我使用zip()
时,它会返回list
而不是tuple
这是我的代码:
import re
bm_raw = open('bookmarks.txt', 'r')
bm_line = bm_raw.read()
matchhref = re.findall('(<DT><A HREF=".*?</A>)', bm_line)
massive = list()
datelist = list()
a = 0
for i in matchhref:
temp = matchhref[a]
found = re.findall('(\d\d\d\d\d\d\d\d\d\d)', temp)
datelist.append(found)
a=a+1
print datelist
print matchhref
zipping = dict(zip(datelist, matchhref))
这里有bookmarks.txt的内容:
<DT><A HREF="some random data" ADD_DATE="1460617925" ICON="some random data">priomap</A>
<DT><A HREF="some random data" ADD_DATE="1455024833" ICON="some random data">V.34</A>
答案 0 :(得分:1)
正如我评论的那样,您可以调用 re.search 然后 .group()添加字符串而不是列表 findall 返回,因此您可以使用字符串作为键,但BeautifulSoup将使您的生活更轻松:
In [50]:from bs4 import BeautifulSoup, Tag
In [51]: soup = BeautifulSoup(h,"xml")
In [52]: print(dict((dt["ADD_DATE"], dt["HREF"],) for dt in soup.select("DT A[HREF]")))
{u'1455024833': u'some random data', u'1460617925': u'some random data'}
select("DT A[HREF]")
在 DT 标记内找到具有 HREF 属性的所有锚标记即A
。
正则表达式的解决方案是:
found = re.search('(\d\d\d\d\d\d\d\d\d\d)', temp)
datelist.append(found.group())
但是使用像bs4这样的html解析器或类似的东西。
答案 1 :(得分:0)
zip
返回元组列表,而不是元组。
此外,如果元组的每个元素都是可清除的,则元组只能是可清除的。因此,列表元组也不会被清除。
也就是说,如果dict(zip(keys, values))
是可清除元素列表,keys
没有错。您的问题是datelist
包含不可清除但不能用作dict密钥的列表(re.findall
的结果)。
但实际上,请阅读其他人提供的建议,并且不要使用re
来解析HTML。 BeautifulSoup是我的首选工具。