BeautifulSoup抓取 - AttributeError:'NoneType'对象没有属性'find'

时间:2016-01-29 09:15:16

标签: python web-scraping beautifulsoup

我正在练习使用BeautifulSoup进行刮擦。下面是我的代码和webspage及其元素的屏幕截图。我想从reddit.com获取每篇帖子的title

代码

import urllib2
from bs4 import BeautifulSoup

url = 'https://www.reddit.com/'
page = urllib2.urlopen(url)
soup = BeautifulSoup(page, 'html.parser')
postTitles = soup.find_all("div", {"class", "thing"})
for title in postTitles:
    tClass = title.find("div", {"class", "entry"})
    postTitle = tClass.find("a", {"class", "title"})
    print postTitle
    print "\n\n"

错误

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'

enter image description here

2 个答案:

答案 0 :(得分:0)

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

{"class", "thing"}

它应该是一个字典,其中属性名称作为键,属性值作为值:

{"class": "thing"}

除此之外,通过搜索包含thing个类的元素,您将获得额外的元素,而a元素不具有class="title"。要解决此问题,请另外检查data-type属性缩小搜索范围

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

答案 1 :(得分:-1)

错误原因

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'

您收到此消息是因为tClass的值为None。所以我们不能在其上调用find。这是错误消息所指出的内容。

调试

请打印出soup的值以检查您获得的HTML回复。有时,Reddit会阻止重复请求,并发送简单的消息而不是通常的列表。

可能的解决方法

使用适当的用户代理和其他内容来模拟人类的正常行为,在浏览器上浏览reddit。

您可能还想尝试使用Selenium执行此操作。

替代

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