[英]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将显示错误。
我需要列出该网站所有项目名称的列表。 例如。:
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!']
或将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标签内也只有一个锚定标签,因此无论采取哪种方法,最终都无法获得多个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.