python-3.x - 无法使用 css 选择器和选择器小工具抓取少数字段
问题描述
所以,我有一个从 class-central.com 抓取数据的项目。我使用选择器小工具来获取一些字段的 .css 标签,但是当我运行我的程序时,我得到的只是一个空字段。我无法识别我的代码中的错误,所以请帮忙!(PS:我是scrapy的新手,这是我的第一个项目。所以请确保您的回答对于像我这样的人来说是可以理解的)
打开以下链接查看字段:https ://www.classcentral.com/subject/cs
我无法抓取以下字段:
- start_date:课程开始的日期。
- via:托管课程的网站(例如 Coursera)。
评分:该课程获得的星数和评论数。
import scrapy from ..items import ClasscentralItem class ClassCentral(scrapy.Spider): name = 'spidy' start_urls = [ 'https://www.classcentral.com/subject/cs' ] def parse(self, response): items = ClasscentralItem() all_tr = response.css('.xlarge-up-width-9-16') courses = response.css('.number-of-courses .text--bold::text') for x in all_tr: sub = response.css('.medium-up-head-1::text').extract() course_name = x.css('.course-name .text-- bold::text').extract() course_devloper = x.css('.uni-name::text').extract() via = x.css('.hover-initiativelinks , #course-listing-tbody .text--italic::text').extract() duration = x.css('.icon-clock-charcoal::text').extract() start_date = x.css('#course-listing-tbody .medium-only-hidden::text').extract() rating =x.css('.review-rating::text').extract() items['subjectname'] = sub items['course_name'] = course_name items['course_devloper'] = course_devloper items['via'] = via items['duration'] = duration items['start_date'] = start_date items['rating'] = rating yield items
解决方案
实际上,您all_tr
只是所有Course Name
列的列表(而不是所有表行)。这就是为什么你不能start_date
从x
(它在另一列)。
def parse(self, response):
items = {}
all_tr = response.css('#course-listing-tbody tr')
courses = response.css('.number-of-courses .text--bold::text')
for x in all_tr:
sub = response.css('.medium-up-head-1::text').extract()
course_name = x.css('.course-name .text--bold::text').get()
course_devloper = x.css('.uni-name::text').extract()
via = x.css('.text--italic::text').get()
duration = x.css('.icon-clock-charcoal::text').extract()
start_date = x.css('.medium-only-hidden::text').get()
rating =x.css('td:nth-child(4)').attrib['data-timestamp']
items['subjectname'] = sub
items['course_name'] = course_name
items['course_devloper'] = course_devloper
items['via'] = via
items['duration'] = duration
items['start_date'] = start_date
items['rating'] = rating
yield items
更新我rating
抓取data-timestamp
第四列的属性(评级)
如果您查看页面源代码,您会发现某些行没有课程详细信息(广告行)。这就是为什么你在 5 个结果后得到一个错误。要获得所有课程,您需要修改all_tr
选择器:
all_tr = response.css('#course-listing-tbody tr[itemscope]')
推荐阅读
- node.js - 以管理员节点 JS 身份运行命令行
- c - 我可以在结束后保存(并使用)传递给函数的 char* 文字吗?
- javascript - Nodejs websocket客户端,接收多条消息
- javascript - 如何在选择后为另一个 id 显示一个值
- python - 如何在 Jupyter(IPython,rpy2)中获得交互式 R 输出,例如用于进度条?
- json - 如何使用 Rest-assured 在 POST 方法的正文中发送嵌套的 JSON
- divi-theme - 在 php 页面上包含 divi 部分
- reactjs - 如何在无状态组件中有条件地更新状态?
- variables - 在汇编中声明 16 位内存变量
- php - 有什么方法可以在 PHP 中保持视频流处于活动状态?