选择器用法
测试网站
https://doc.scrapy.org/en/latest/_static/selectors-sample1.html
使用 scrapy shell 测试网站 进入交互模式
使用 xpath 抓取
>>> response.selector.xpath('//title/text()')
[<Selector (text) xpath=//title/text()>]
使用 css抓取
>>> response.selector.css('title::text')
[<Selector (text) xpath=//title/text()>]
此时,xpath和css选择的时候可以将selector方法直接省去
>>> response.xpath('//title/text()')
[<Selector (text) xpath=//title/text()>]
>>> response.css('title::text')
[<Selector (text) xpath=//title/text()>]
css获取属性使用两个冒号(::),结果为一个列表中有多个选择器标签
>>> response.xpath('//div[@id="images"]').css('img::attr(src)')
[<Selector xpath='descendant-or-self::img/@src' data='image1_thumb.jpg'>, <Selector xpath='descendant-or-self::img/@src' data='image2_thumb.jpg'>, <Selector xpath='descendant-or-self::img/@src' data='image3_thumb.jpg'>, <Selector xpath='descendant-or-self::img/@src' data='image4_thumb.jpg'>, <Selector xpath='descendant-or-self::img/@src' data='image5_thumb.jpg'>]
使用extract()可以将选择器选择的内容变成一个列表
response.xpath('//div[@id="images"]').css('img::attr(src)').extract()
['image1_thumb.jpg', 'image2_thumb.jpg', 'image3_thumb.jpg', 'image4_thumb.jpg','image5_thumb.jpg']
使用extract_first可以将selector的第一个元素取出来
>>> response.xpath('//div[@id="images"]').css('img::attr(src)').extract_first()
'image1_thumb.jpg'
extract_frist可以设置default,如果查找不到就输出默认值
>>> response.xpath('//div[@id="images"]').css('img::attr(srcc)').extract_first(default='123')
'123'
匹配属性里包含某个字段的方法
>>> response.xpath('//a[contains(@href, "image")]/@href').extract()
['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']
>>> response.css('a[href*=image]::attr(href)').extract()
['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']
匹配某个标签下的一个标签的属性
>>> response.css('a[href*=image] img::attr(src)').extract()
['image1_thumb.jpg', 'image2_thumb.jpg', 'image3_thumb.jpg', 'image4_thumb.jpg','image5_thumb.jpg']
使用re(正则表达式)匹配------默认会输出括号里需要匹配的内容
>>> response.css('a::text').extract()
['Name: My image 1 ', 'Name: My image 2 ', 'Name: My image 3 ', 'Name: My image4 ', 'Name: My image 5 ']
>>> response.css('a::text').re('Name\:(.*)')
[' My image 1 ', ' My image 2 ', ' My image 3 ', ' My image 4 ', ' My image 5 ']
>>> response.css('a::text').re_first('Name\:(.*)')
'My image 1'