繁体   English   中英

Python 3.5 | 从网站抓取数据

[英]Python 3.5 | Scraping data from website

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

我需要Project-title的字符串。 网站结构合理,每个项目都有此行。

 <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将显示错误。

我需要列出该网站所有项目名称的列表。 例如。:

  • 超级本:只需99美元即可将智能手机变成笔记本电脑
  • 重量:更智能称重
  • 卡方无人驾驶飞机世界上第一个也是唯一一个完成
  • 气象摄像头系统Omega2:5美元的IoT计算机,带有Wi-Fi,由Linux提供支持

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和class 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)

编辑:获取元素的描述(class 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'})]

关于这篇文章的标题,我建议您基于从网站上抓取特定数据的两个不同的教程。 他们确实有关于如何完成任务的详细说明。

首先,我建议您检出pyimagesearch 使用scrapy刮取图像。

那么您应该尝试是否更具体的网络抓取将对您有所帮助。

您想要的所有数据都在具有css类staff-picks的部分中 ,只需找到具有project-title类的h6并从内部的anchor标记中提取文本即可:

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标签内也只有一个锚定标签,因此无论采取哪种方法,最终都无法获得多个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM