使用beautifulsoup'NoneType'对象进行网页抓取没有属性'get_text'

时间:2020-02-11 15:32:40

标签: python beautifulsoup

我正在尝试学习beautifulsoup来简化NYT政治文章中的文本,目前使用我现在拥有的代码,它确实设法抓取了两个段落,但之后,它吐出了AttributeError:'NoneType'对象没有属性“ get_text”。我已经查看了此错误,一些线程声称该错误源自使用beautifulsoup3中的旧函数。但这似乎不是问题所在吗?

代码:

lib

输出:

import requests
from urllib import request, response, error, parse
from urllib.request import urlopen
from bs4 import BeautifulSoup




url = "https://www.nytimes.com/2020/02/10/us/politics/trump-manchin-impeachment.html"
html = urlopen(url)
soup = BeautifulSoup(html, "html.parser")


title = soup.title
titleText = title.get_text()

body = soup.find('article', class_='css-1vxca1d')

section = soup.find('section', class_="css-1r7ky0e")
for elem in section:
    div1 = elem.findAll('div')
    for x in div1:
        div2 = elem.findAll('div')
        for i in div2:
            text = i.find('p').get_text()
            print (text)
            print("----------")

1 个答案:

答案 0 :(得分:1)

就像我在评论中提到的那样,当您执行text = i.find('p').get_text()时,实际上是在执行2次操作。

首先获取所有<p>标签,然后获取其文本。 i.find('p')在某个时候返回None。因此None.get_text()会给您一个错误。

您会看到此消息,因为错误消息告诉您'NoneType' object has no attribute 'get_text'

来自docs

如果find_all()找不到任何内容,则会返回一个空列表。如果find()找不到任何内容,则返回None

一种快速的解决方法是检查i.find('p')是否不返回None

# ...
for elem in section:
    div1 = elem.findAll('div')
    for x in div1:
        div2 = elem.findAll('div')
        for i in div2:
            p = i.find('p')
            if p is not None:
                text = p.get_text()
                print (text)
                print("----------")

还请注意,find()只会返回您的第一个<p>,如果有的话,将忽略其他人。