我正在尝试学习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("----------")
答案 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>
,如果有的话,将忽略其他人。