我正在练习使用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'
答案 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以查看它是否符合您的需求。