Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python BeautifulSoup刮削-属性错误:';非类型';对象没有属性';查找';_Python_Web Scraping_Beautifulsoup - Fatal编程技术网

Python BeautifulSoup刮削-属性错误:';非类型';对象没有属性';查找';

Python BeautifulSoup刮削-属性错误:';非类型';对象没有属性';查找';,python,web-scraping,beautifulsoup,Python,Web Scraping,Beautifulsoup,我正在和美女苏练习刮水。下面是我的代码和网页及其元素的屏幕截图。我正试图从reddit.com获取每篇文章的标题 代码: 错误: Traceback (most recent call last): File "scrapingtest.py", line 21, in <module> postTitle = tClass.find("a", {"class", "title"}) AttributeError: 'NoneType' object has no att

我正在和美女苏练习刮水。下面是我的代码和网页及其元素的屏幕截图。我正试图从reddit.com获取每篇文章的
标题

代码:

错误

Traceback (most recent call last):
  File "scrapingtest.py", line 21, in <module>
    postTitle = tClass.find("a", {"class", "title"})
AttributeError: 'NoneType' object has no attribute 'find'
回溯(最近一次呼叫最后一次):
文件“scrapingtest.py”,第21行,在
postTitle=tClass.find(“a”,{“class”,“title”})
AttributeError:“非类型”对象没有属性“查找”

错误原因
回溯(最近一次呼叫最后一次):
文件“scrapingtest.py”,第21行,在
postTitle=tClass.find(“a”,{“class”,“title”})
AttributeError:“非类型”对象没有属性“查找”
之所以会出现这种情况,是因为
tClass
的值是
None
。因此,我们无法在其上调用
find
。这就是错误消息的状态

调试 请打印出
soup
的值以检查您得到的html响应。有时Reddit会阻止重复的请求,并发送一条简单的消息,而不是通常的列表

可能的解决办法 使用适当的用户代理和其他东西来模拟人类的适当行为,在浏览器上浏览reddit

您可能还想尝试使用Selenium来实现这一点

选择
Reddit还提供用于收集数据和构建机器人的API。我个人从未尝试过。所以不确定什么是允许的,什么是不允许的。您可以查看他们的API,看看它是否符合您的需要

如何应用属性检查存在问题。而不是,例如:

{"class", "thing"}
它应该是一个字典,属性名称作为键,属性值作为值:

{"class": "thing"}

除此之外,通过搜索具有
thing
类的元素,您将获得没有
a
元素且具有
class=“title”
的额外元素。要解决此问题,请通过额外检查
数据类型
属性缩小搜索范围:

postTitles = soup.find_all("div", {"class", "thing", "data-type": "link"})

这不是一个答案,但为了以防万一,Reddit通过一个API(它有一个很棒的Python包装器)公开了他们的数据。这将使从Reddit收集数据比使用刮刀简单得多。
{"class": "thing"}
postTitles = soup.find_all("div", {"class", "thing", "data-type": "link"})