AttributeError: 'NoneType' object has no attribute 'findChildren' (Beautiful Soup)
AttributeError: 'NoneType' object has no attribute 'findChildren' (Beautiful Soup)
我正在尝试使用 Beautiful Soup 构建一个字典,其中包含许多不同博客 post id 的标签。
我先写了一个函数来处理一个post ID:
def tags(id_):
r = h.unescape(requests.get('https://example.com/category/'+id_).text)
soup = BeautifulSoup(r)
return {"id": id_, "tags": [tag.text for tag in soup.find("ul",{"class":\
"tags"}).findChildren("a")]}
..我得到了我所期待的:
tags('a123')
{'id': 'a123', 'tags': [u'food and drink', u'beer', u'sonoma county']}
我修改了函数以循环遍历 post 个 ID 列表,例如:
postids = ['a123', 'b456', 'c789']
tags_dict = {}
def tags_list(postids):
for id_ in postids:
r = h.unescape(requests.get('https://example.com/category/'+id_).text)
soup = BeautifulSoup(r)
tags_dict['id'] = id_
tags_dict['tags'] = [tag.text for tag in soup.find('ul',{'class':\
"tags"}).findChildren('a')]
当我 运行 tags_list(postids)
时,我得到:
AttributeError: 'NoneType' object has no attribute 'findChildren'
...我不确定为什么。关于如何修复的任何想法?还是有更好的方法来解决问题?
编辑: 下面是我最终使用的函数的最终版本。我想要一个列表而不是字典,所以我也做了那个改变。
postids = ['a123', 'b456', 'c789']
def tags_list(postids):
tags_data = []
for id_ in postids:
r = h.unescape(requests.get('https://example.com/category/'+id_).text)
soup = BeautifulSoup(r)
data = {}
data['postid'] = id_
data['tags'] = [child.text
for tag in [soup.find('ul',{'class': "tags"})]
if tag
for child in tag.findChildren('a')]
tags_data.append(data)
return tags_data
这是一个示例输出:
[{'postid': 'a123', 'tags': [u'food and drink', u'beer', u'sonoma']},
{'postid': 'b456', 'tags': [u'travel', u'road trips', u'camping']},
{'postid': 'c789', 'tags': [u'cooking', u'grilling', u'steak']}]
soup.find('ul',{'class': "tags"})
返回 None
。
如果你想在列表理解中使用它,你需要在使用它们之前过滤掉 None
的值。
有一个技巧,您可以将值放在列表中以便过滤它:
tags_dict['tags'] = [child.text
for tag in [soup.find('ul',{'class': "tags"})]
if tag
for child in tag.findChildren('a')]
我正在尝试使用 Beautiful Soup 构建一个字典,其中包含许多不同博客 post id 的标签。
我先写了一个函数来处理一个post ID:
def tags(id_):
r = h.unescape(requests.get('https://example.com/category/'+id_).text)
soup = BeautifulSoup(r)
return {"id": id_, "tags": [tag.text for tag in soup.find("ul",{"class":\
"tags"}).findChildren("a")]}
..我得到了我所期待的:
tags('a123')
{'id': 'a123', 'tags': [u'food and drink', u'beer', u'sonoma county']}
我修改了函数以循环遍历 post 个 ID 列表,例如:
postids = ['a123', 'b456', 'c789']
tags_dict = {}
def tags_list(postids):
for id_ in postids:
r = h.unescape(requests.get('https://example.com/category/'+id_).text)
soup = BeautifulSoup(r)
tags_dict['id'] = id_
tags_dict['tags'] = [tag.text for tag in soup.find('ul',{'class':\
"tags"}).findChildren('a')]
当我 运行 tags_list(postids)
时,我得到:
AttributeError: 'NoneType' object has no attribute 'findChildren'
...我不确定为什么。关于如何修复的任何想法?还是有更好的方法来解决问题?
编辑: 下面是我最终使用的函数的最终版本。我想要一个列表而不是字典,所以我也做了那个改变。
postids = ['a123', 'b456', 'c789']
def tags_list(postids):
tags_data = []
for id_ in postids:
r = h.unescape(requests.get('https://example.com/category/'+id_).text)
soup = BeautifulSoup(r)
data = {}
data['postid'] = id_
data['tags'] = [child.text
for tag in [soup.find('ul',{'class': "tags"})]
if tag
for child in tag.findChildren('a')]
tags_data.append(data)
return tags_data
这是一个示例输出:
[{'postid': 'a123', 'tags': [u'food and drink', u'beer', u'sonoma']},
{'postid': 'b456', 'tags': [u'travel', u'road trips', u'camping']},
{'postid': 'c789', 'tags': [u'cooking', u'grilling', u'steak']}]
soup.find('ul',{'class': "tags"})
返回 None
。
如果你想在列表理解中使用它,你需要在使用它们之前过滤掉 None
的值。
有一个技巧,您可以将值放在列表中以便过滤它:
tags_dict['tags'] = [child.text
for tag in [soup.find('ul',{'class': "tags"})]
if tag
for child in tag.findChildren('a')]