和xpath选择器比起来,感觉CSS选择器容易一些,跟写.css时方法基本一样,就是在获取内容时和xpath不同,这里需要注意一下.
这里介绍如何用css选择器提取出一篇文章的数据
提取的数据跟xpath那篇文章内容相同
之前xpath中我们获取元素是通过.entry-header h1::text
,如果是属性则用.entry-header a::attr(href)
介绍一个常用的函数extract_first()
相当于extract()[0]
,但是extract()[0]当数组没有元素时,也就是没有获取到数据时会出错,所以用extract_first()
方法,也可以加上需要返回的内容,比如空,extract_first("")
title = response.css(".entry-header h1::text").extract_first()
#p可以不加
create_date = response.css("p.entry-meta-hide-on-mobile::text").extract()[0].strip().replace('·','').strip()
#获取点赞数
praise_nums = response.css('#110287votetotal::text').extract()[0]
#获取收藏数
fav_nums = response.css('.btn-bluet-bigger.href-style.bookmark-btn .register-user-only::text ').extract()[0].strip()
match_re = re.match('.*?(\d+).*',fav_nums)
if match_re:
#获取收藏数
fav_nums = match_re.group(1)
comment_nums = response.css('.btn-bluet-bigger.href-style.hide-on-480::text').extract()[0].strip()
match_re = re.match('.*?(\d+).*',fav_nums)
if match_re:
comment_nums = match_re.group(1)
tag_list = response.css('.entry-meta-hide-on-mobile a::text').extract()
content = response.css('div.entry').extract()[0]
tag_list = [element for element in tag_list if not element.strip().endswith('评论')]
tag = ','.join(tag_list)
当我们要选择的属性名字有多个时比如下面:
这市在选择时应该用
post_urls = response.css('#archive .post.floated-thumb .post-thumb a::attr(href)').extract()
也就是.post.floated-thumb应该连起来,或者只写.floated-thumb
##完整代码(准)
def parse_detail(self, response):
title = response.css(".entry-header h1::text").extract_first()
create_date = response.css("p.entry-meta-hide-on-mobile::text").extract()[0].strip().replace("·","").strip()
praise_nums = response.css(".vote-post-up h10::text").extract()[0]
fav_nums = response.css(".bookmark-btn::text").extract()[0]
match_re = re.match(".*?(\d+).*", fav_nums)
if match_re:
fav_nums = int(match_re.group(1))
else:
fav_nums = 0
comment_nums = response.css("a[href='#article-comment'] span::text").extract()[0]
match_re = re.match(".*?(\d+).*", comment_nums)
if match_re:
comment_nums = int(match_re.group(1))
else:
comment_nums = 0
content = response.css("div.entry").extract()[0]
tag_list = response.css("p.entry-meta-hide-on-mobile a::text").extract()
tag_list = [element for element in tag_list if not element.strip().endswith("评论")]
tags = ",".join(tag_list)
pass