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-title的h6的类并从里面的锚标签中提取文本:
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!']
或将 find 与 find_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 |从网站抓取数据的主要内容,如果未能解决你的问题,请参考以下文章