当有数据时,为什么我会收到此属性错误?

时间:2015-12-18 14:15:08

标签: python python-3.x

我正在通过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()标签内容。

是什么给出了?

1 个答案:

答案 0 :(得分:0)

使用tag.text代替tag.stringtag.stringNavigableString,如果标记不包含文本,则可以是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

我不知道这个变量是如何填充的。我认为它来自于使用lxmlhtml5lib