【Python 爬虫教程】Scrapy 学习笔记(三)
scrapy 中选择器的用法。[🍒点击查看原文。](https://lijianxun.top/113.html)我们选用的测试网页是 scrapy 官网推荐的测试网页,结构非常简单,但足够我们用来学习其用法。
(https://doc.scrapy.org/en/latest/_static/selectors-sample1.html)
!(https://i.loli.net/2020/02/20/ZsTtpQcSNMqkUAz.png)
我们主要使用三种选择器,读者可以根据自己的学习情况和网页结构选择使用。选择器分别是:xpath、css和re。这三种选择器实现的功能相同,所以熟悉哪个用哪个就行,语法都比较简单。
> 网页源码
```html
<html>
<head>
<base/>
<title>Example website</title>
</head>
<body>
<div id='images'>
<a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
<a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
<a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
<a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
<a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
</div>
</body>
</html>
```
我们在scrapy shell中学习这三种选择器的用法,实时反馈抓取到的信息。
```bash
scrapy shell https://doc.scrapy.org/en/latest/_static/selectors-sample1.html
```
## 获取title
```bash
In : response.xpath('//title/text()')
Out: [<Selector xpath='//title/text()' data='Example website'>]
In : response.css('title::text')
Out: [<Selector xpath='descendant-or-self::title/text()' data='Example website'>]
In : response.xpath('//title/text()').extract_first()
Out: 'Example website'
In : response.css('title::text').extract_first()
Out: 'Example website'
```
## 获取href
```bash
In : response.xpath('//div[@id="images"]/a/@href').extract()
Out: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']
In : response.css('div a::attr(href)').extract()
Out: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']
```
还可以这么用:
```bash
In : response.xpath('//div[@id="images"]').css('img::attr("src")')
Out:
[<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'>]
In : response.xpath('//div[@id="images"]').css('img::attr("src")').extract()
Out:
['image1_thumb.jpg',
'image2_thumb.jpg',
'image3_thumb.jpg',
'image4_thumb.jpg',
'image5_thumb.jpg']
```
## default
```bash
In : response.xpath('//div[@id="images"]').css('img::attr("src")').extract_first(default="None")
Out: 'image1_thumb.jpg'
In : response.xpath('//div[@id="images"]').css('img::attr("srcq")').extract_first(default="None")
Out: 'None'
```
使用default要注意只能在`extract_first`中使用。如果获取到信息,就正常显示,如果找不到内容就返回default定义的信息。
## 获取文本内容
```bash
In : response.xpath('//a/text()').extract()
Out:
['Name: My image 1 ',
'Name: My image 2 ',
'Name: My image 3 ',
'Name: My image 4 ',
'Name: My image 5 ']
In : response.css('a::text').extract()
Out:
['Name: My image 1 ',
'Name: My image 2 ',
'Name: My image 3 ',
'Name: My image 4 ',
'Name: My image 5 ']
```
## 根据属性定位
如果我们想获取属性名称包含`image`的超链接,就可以使用这种方法。
```bash
In : response.xpath('//a/@href').extract()
Out: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']
In : response.css('a::attr(href)').extract()
Out: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']
```
还有:
```bash
In : response.xpath('//a/img/@src').extract()
Out:
['image1_thumb.jpg',
'image2_thumb.jpg',
'image3_thumb.jpg',
'image4_thumb.jpg',
'image5_thumb.jpg']
In : response.css('a img::attr(src)').extract()
Out:
['image1_thumb.jpg',
'image2_thumb.jpg',
'image3_thumb.jpg',
'image4_thumb.jpg',
'image5_thumb.jpg']
```
## 使用re
```bash
In : response.css('a::text').re('Name\:(.*)')
Out:
[' My image 1 ',
' My image 2 ',
' My image 3 ',
' My image 4 ',
' My image 5 ']
In : response.css('a::text').re_first('Name\:(.*)').strip()
Out: 'My image 1'
```
以上这些就是就是选择器的基本用法了,如果你熟悉 xpath,css,re 的语法,接受起来应该非常容易,只是个别语法适应scrapy就好。
在以后的爬取中要学会使用这些选择器,事半功倍。 占个楼,哈哈哈哈 感谢楼主教学分享,看了前两篇学习教程真的很棒值得学习加油 感谢楼主分享 感谢分享 感谢楼主分享!!! 感谢楼主分享
这个不错! 同样正要学习,感谢分享
页:
[1]