我在BeautifulSoup(python)中遇到了navigablestrings和unicode的问题。
基本上,我正在从youtube解析四个结果页面,并将顶部结果的扩展名(youtube.com/watch?=之后的网址末尾)放入列表中。
然后我将列表循环到另外两个函数中,在一个函数中,它抛出了这个错误:TypeError: 'NavigableString' object is not callable
。但是,另一个人说TypeError: 'unicode' object is not callable
。两者都使用完全相同的字符串。
我在这里做错了什么?我知道我的解析代码可能不完美,我正在使用BeautifulSoup和regex。在过去每当我收到NavigableString错误时,我只是抛出一个“.encode('ascii','ignore')或者只是str(),这似乎有效。任何帮助都会受到赞赏!
for url in urls:
response = urllib2.urlopen(url)
html = response.read()
soup = BeautifulSoup(html)
link_data = soup.findAll("a", {"class":"yt-uix-tile-link result-item-translation-title"})[0]
ext = re.findall('href="/(.*)">', str(link_data))[0]
if isinstance(ext, str):
exts.append('http://www.youtube.com/'+ext.replace(' ',''))
然后:
for ext in exts:
description = description(ext)
embed = embed(ext)
我只添加了isinstance()行来尝试查看问题所在。当'str'更改为'unicode'时,exts列表为空(表示它们是字符串,而不是unicode(甚至是navigablestrings?))。我很困惑......
答案 0 :(得分:1)
description = description(ext)
用字符串替换该函数。与embed
相同。
答案 1 :(得分:0)
for ext in exts:
description = description(ext)
embed = embed(ext)
description()
和embed()
是功能。例如
def description(): #this is a function
return u'result'
然后
description = description(ext)
#now description is a unicode object, and it is not callable.
#It is can't call like this description(ext) again
我认为这两个函数description()
和embed()
都返回'NavigableString' object
和'unicode' object
。这两个对象不是callable
。
所以你应该重新使用这两行,例如:
for ext in exts:
description_result = description(ext)
embed_result = embed(ext)