官方文档
Using selectors
To explain how to use the selectors we’ll use the Scrapy shell (which provides interactive testing) and an example page located in the Scrapy documentation server:
https://docs.scrapy.org/en/latest/_static/selectors-sample1.html
<!DOCTYPE html>
<html>
<head>
<base href='http://example.com/' />
<title>Example website</title>
</head>
<body>
<div id='images'>
<a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' alt='image1'/></a>
<a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' alt='image2'/></a>
<a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' alt='image3'/></a>
<a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' alt='image4'/></a>
<a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' alt='image5'/></a>
</div>
</body>
</html>
进入命令行交互模式:
scrapy shell https://docs.scrapy.org/en/latest/_static/selectors-sample1.html
输入
response.selector
输出:request内置的selector选择器
XPath选择器
let’s construct an XPath for selecting the text inside the title tag:
response.xpath("//title/text()")
输出选择器与内容.
css选择器
response.css("title::text").get()
xpath和css的运用
xpath查找images标签
response.xpath('//div[@id="images"]')
response.xpath('//div[@id="images"]').css("img")
css可以用::attr()获取属性:
response.xpath('//div[@id="images"]').css("img::attr(src)").extract()
default:查不到内容返回default里内容
href标签:
contains
找属性名称包含image的所有的超链接可以使用contains选项,第一个参数是属性名,第二个属性是要查找的值
response.xpath('//a[contains(@href,"image")]/@href').extract()
CSS的写法:
response.css('a[href*=image]::attr(href)').extract()
假如我们要选择所有a标签里的img里面的src属性,用上contains:
response.xpath('//a[contains(@href,"image")]/img/@src').extract()
CSS:注意[]之后要有空格
response.css('a[href*=image] img::attr(src)').extract()
正则表达式
提取内容
提取冒号后的内容,就需要正则表达式了,注意,\用来对:进行转义。
response.css('a::text').re('Name\:(.*)')
与extract()方法类似,re也提供了取得列表中第一个元素的方法:re_first()
response.css('a::text').re_first('Name\:(.*)')
进一步地,可以使用strip()方法,去掉返回结果中前后的空格:
response.css('a::text').re_first('Name\:(.*)').strip()
小结
response为我们提供了几个提取方法:
- xpath
- CSS
- re
返回的结果都是Selector类型,可以进行嵌套循环。
a) 对css来说:
- 获取a标签中的文本内容:response.css(‘a::text’)
- 获取a标签中的某个属性:response.css(‘a::attr(属性)’)
(b)对xpath来说:
- 获取a标签中的文本内容:response.xpath(‘//a/text()’)
- 获取a标签中的某个属性:response.xpath(‘//a/@href’)
两种选择方法,写法不同,效果类似。
要从selector变为数据,则在后面加上.extract() 或 .extract()_first() 或.extract()[x](x为list中元素的下标)。
如果要提取更具体的信息,可以用正则表达式的方法,在后面加上 .re() 或 .re()_first 进行嵌套选择。