第五章 网站内容爬取之css选择器在某个网页上的实践

2018-08-27  本文已影响122人  田同学的小迷妹儿

css选择器:通过一定的语法定位到某一个元素,与xpath选择的功能是一样的

5.1 css选择器的常见用法

表达式 说明
* 选择所有节点
#container 选择id为container的节点
.container 选取所有class包含container的节点
li a 选取所有li下的所有a节点
ul + p (兄弟节点,后面的,不是子节点意思)选择ul后面的第一个p元素
div#container > ul (父子)选取id为container的div的第一个ul子元素
表达式 说明
ul ~ p 选取与ul相邻的所有p元素
a[title] 选取所有有title属性的a元素(属性有没有值都无所谓)
a[color="red"] 选取所有color属性为red值的a
a[href*="jobbole"] 选取所有href属性包含jobbole的a元素
a[href^="http"] 选取所有href属性值以http开头的a元素
a[hre$=".jpg"] 选取所有href属性值以.jpg结尾的a元素
input[type=radio]:checked input是元素,类型是radio,选取选中的radio的元素
表达式 说明
div:not(#container) 选取所有id非container的div元素
li:nth-child(3) 选取第三个li元素
tr:nth-child(2n) 第偶数个tr

几乎对于所有的元素来说,用xpath和css都是可以完成定位功能的,但对前端朋友来说比较熟悉前端的写法,scrapy提供两种方法。css的写法是比xpath更简短的,在浏览器中都能直接获取。对前端熟悉的人可以优先考虑使用css选择器来定位一个元素,对于之前用xpath做实例的网页全用css选择器,代码如下:

title = response.xpath("div.entry-header h1::text").extract()[0]
# '用 Vue 编写一个长按指令'
create_date = response.css("p.entry-meta-hide-on-mobile::text").extract()[0].strip().replace("·", "").strip()
# '2018/08/22'
praise_ums = response.css(".vote-post-up h10::text").extract_first()
if praise_ums:
    praise_ums = int(praise_ums)
else:
    praise_ums = 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]

tags = 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)

注意,提示一个新的函数,extract_first(),这个函数就是相当于之前的extract()[0],但是前者好处在于避免了当取出数组为空的情况,这时候取[0]元素是会报错的,不得不做异常处理。extract()函数可以传入参数,表示如果找到的数组为空,那么就返回默认值。比如extract("")就表示如果前面取出数组为空,那么就返回空字符串。

上一篇下一篇

猜你喜欢

热点阅读