我正在通过this NewBoston tutorial制作一个字频计算器。它首先从网页抓取文本,然后清理它并计算单词。我处于第一阶段,从页面上删除文本:
def start(url):
word_list = []
source_code = requests.get(url, verify=True).text
soup = BeautifulSoup(source_code)
for page_text in soup.find_all('p'):
content = page_text.string
print(content)
words = content.lower().split()
for each_word in words:
word_list.append(each_word)
当我运行它时,我收到以下错误:
Traceback (most recent call last):
File "C:/Users/user/PycharmProjects/NewBostonTuts/WordFrequency.py", line 30, in <module>
start('https://www.example.com')
File "C:/Users/user/PycharmProjects/NewBostonTuts/WordFrequency.py", line 13, in start
words = content.lower().split()
AttributeError: 'NoneType' object has no attribute 'lower'
这告诉我,它没有让任何content
使用,但正如您所见,我在尝试content
和{{1}之前打印出lower()
它按预期输出 - 显示所有split()
标签内容。
是什么给出了?
答案 0 :(得分:0)
使用tag.text
代替tag.string
。 tag.string
是NavigableString,如果标记不包含文本,则可以是NoneType
类型,而在这种情况下tag.text
包含长度为0的字符串。
<强> tag.string 强>
在此标记中获取单个字符串的便捷属性。
:返回:如果此标记具有单个字符串子项,则返回值为 串。如果此标签没有子节点或多个子节点,则返回 值为无。如果此标记有一个子标记,则返回值为 子标记的'string'属性,递归。
这是该属性的实现
if len(self.contents) != 1:
return None
child = self.contents[0]
if isinstance(child, NavigableString):
return child
return child.string
tag.text