Python 3.5 |从网站抓取数据

Posted

技术标签:

【中文标题】Python 3.5 |从网站抓取数据【英文标题】:Python 3.5 | Scraping data from website 【发布时间】:2016-11-28 14:50:53 【问题描述】:

我想抓取网站Kickstarter.com的特定部分

我需要项目标题的字符串。网站是结构化的,每个项目都有这条线。

<div class="Project-title">

我的代码如下:

#Loading Libraries
import urllib
import urllib.request
from bs4 import BeautifulSoup

#define URL for scraping
theurl = "https://www.kickstarter.com/discover/advanced?category_id=16&woe_id=23424829&sort=popularity&seed=2448324&page=1"
thepage = urllib.request.urlopen(theurl)

#Cooking the Soup
soup = BeautifulSoup(thepage,"html.parser")

#Scraping "Project Title" (project-title)
project_title = soup.find('h6', 'class': 'project-title').findChildren('a')
title = project_title[0].text
print (title)

如果我使用 soup.find_all 或在 Project_title[0] 行设置另一个值而不是零,Python 会显示错误。

我需要一份包含本网站所有项目名称的列表。例如:

The Superbook:只需 99 美元即可将您的智能手机变成笔记本电脑 称量:称量更智能 Mine Kafon Drone 世界上第一个也是唯一一个完成 Weather Camera System Omega2:5 美元的带 Wi-Fi 的物联网计算机,由 Linux

【问题讨论】:

看BeautifulSoup的find函数,你会发现它只返回第一个元素=/ @Sebastian Fischer,如果您有新问题,请提出新问题,请勿将答案中的代码编辑到原始问题中 【参考方案1】:

find()只返回一个元素。要全部获取,必须使用findAll

这是您需要的代码

project_elements = soup.findAll('h6', 'class': 'project-title')
project_titles = [project.findChildren('a')[0].text for project in project_elements]
print(project_titles)

我们查看标签h6 和类project-title 的所有元素。然后我们从每个元素中获取标题,并用它创建一个列表。

希望对您有所帮助,如有任何问题,请随时提问。

编辑:上面代码的问题是,如果我们没有为findAll返回的列表中的每个元素获得至少一个标签a的孩子,它将失败

如何预防:

project_titles = [project.findChildren('a')[0].text for project in project_elements if project.findChildren('a')]

仅当project.findChildren('a') 作为至少一个元素时才会创建列表。 (if [] 返回 False)

edit : 要获取元素的描述(project-blurb 类),让我们看一下 HTML 代码。

<p class="project-blurb">
Bagel is a digital tape measure that helps you measure, organize, and analyze any size measurements in a smart way.
</p>

这只是project-blurb类的一段。要获取它们,我们可以使用与获取 project_elements 相同的方法,或者更简洁:

project_desc = [description.text for description in soup.findAll('p', 'class': 'project-blurb')]

【讨论】:

嘿HolyDana。太感谢了!!!!!但我收到一个错误:“IndexError:列表索引超出范围”。你知道为什么吗? @SebastianFischer 此错误来自project.findChildren('a')[0]:它无法为其中一个元素找到至少一个子元素。我将进行编辑以添加另一种方法来执行此操作,同时防止出现此错误。 哦,HolyDonna.. 谢谢。但它不会起作用。当我打印 project_titles 时,我只得到结果“[]” @SebastianFischer 我才意识到我忘记使用findAll 而不是find .... 现在代码应该是正确的。 嘿@HolyDanna....谢谢。该代码有效。现在我得到一个列表,用逗号和正确的字符串分隔。我想将您的代码改编为“Project-blurb”类以获取项目的描述。我将代码粘贴在我的问题中......谢谢【参考方案2】:

你想要的所有数据都在带有css类staff-picks的部分中,只需找到带有project-titleh6的类并从里面的锚标签中提取文本:

soup = BeautifulSoup(thepage,"html.parser")


print [a.text for a in soup.select("section.staff-picks h6.project-title a")]

输出:

[u'The Superbook: Turn your smartphone into a laptop for $99', u'Weighitz: Weigh Smarter', u'Omega2: $5 IoT Computer with Wi-Fi, Powered by Linux', u"Bagel: The World's Smartest Tape Measure", u'FireFlies - Truly Wire-Free Earbuds - Music Without Limits!', u'ISOLATE\xae - Switch off your ears!']

或将 findfind_all 一起使用:

project_titles = soup.find("section",class_="staff-picks").find_all("h6", "project-title")
print([proj.a.text for proj in project_titles])

每个 h6 标记内也只有一个锚标记,因此无论您采用哪种方法,最终都不能超过一个。

【讨论】:

【参考方案3】:

关于这篇文章的标题,我会向您推荐两个基于从网站上抓取特定数据的不同教程。他们确实对如何完成任务有详细的解释。

首先我会建议结帐 pyimagesearch Scraping images using scrapy.

如果你更具体web scraping will help you.,那么你应该尝试

【讨论】:

以上是关于Python 3.5 |从网站抓取数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 从网站上抓取数据 [关闭]

用一行Python代码在几秒钟内抓取任何网站

用一行Python代码在几秒钟内抓取任何网站

从网站抓取数据的3种最佳方法

从气候变化网站 PYTHON 抓取文件

需要登录的网站的网络抓取[重复]